Bot image for GPT-4

Shared conversation

GPT-4 ·

Implement a period life table in Haskell.

A period life table is a statistical tool used to analyze the mortality rates and life expectancies of a population at different ages. In this example, we'll create a simple period life table in Haskell.

First, let's define the main data types and functions we'll be using:

haskell
module LifeTable (LifeTable, Age, DeathRate, LifeExpectancy, makeLifeTable, mortality, lifeExpectancy) where

type Age = Int
type DeathRate = Double
type LifeExpectancy = Double
type LifeTableEntry = (Age, DeathRate, LifeExpectancy)
type LifeTable = [LifeTableEntry]

Here, we're defining the LifeTable as a list of LifeTableEntry tuples, each containing an Age, a DeathRate, and a LifeExpectancy. We'll also create a makeLifeTable function to construct a life table from a list of age-specific death rates.

haskell
makeLifeTable :: [(Age, DeathRate)] -> LifeTable
makeLifeTable deathRates = zipWith3 (,,) ages deathRates lifeExpectancies
    where
        ages = map fst deathRates
        lifeExpectancies = computeLifeExpectancies deathRates

To compute the life expectancies, we'll create a helper function called computeLifeExpectancies:

haskell
computeLifeExpectancies :: [(Age, DeathRate)] -> [LifeExpectancy]
computeLifeExpectancies deathRates = reverse $ snd $ foldr step (1, []) deathRates
    where
        step (age, deathRate) (prevLx, lifeExpectancies) =
            let lx = prevLx / (1 - deathRate)
            in (lx, lx : lifeExpectancies)

Lastly, we'll create two utility functions to query the life table for the mortality rate and life expectancy at a given age:

haskell
mortality :: LifeTable -> Age -> Maybe DeathRate
mortality lifeTable age = lookup age lifeTable >>= (\(_, dr, _) -> Just dr)

lifeExpectancy :: LifeTable -> Age -> Maybe LifeExpectancy
lifeExpectancy lifeTable age = lookup age lifeTable >>= (\(_, _, le) -> Just le)

Now, let's put everything together:

haskell
module LifeTable
    ( LifeTable
    , Age
    , DeathRate
    , LifeExpectancy
    , makeLifeTable
    , mortality
    , lifeExpectancy
    ) where

type Age = Int
type DeathRate = Double
type LifeExpectancy = Double
type LifeTableEntry = (Age, DeathRate, LifeExpectancy)
type LifeTable = [LifeTableEntry]

makeLifeTable :: [(Age, DeathRate)] -> LifeTable
makeLifeTable deathRates = zipWith3 (,,) ages deathRates lifeExpectancies
    where
        ages = map fst deathRates
        lifeExpectancies = computeLifeExpectancies deathRates

computeLifeExpectancies :: [(Age, DeathRate)] -> [LifeExpectancy]
computeLifeExpectancies deathRates = reverse $ snd $ foldr step (1, []) deathRates
    where
        step (age, deathRate) (prevLx, lifeExpectancies) =
            let lx = prevLx / (1 - deathRate)
            in (lx, lx : lifeExpectancies)

mortality :: LifeTable -> Age -> Maybe DeathRate
mortality lifeTable age = lookup age lifeTable >>= (\(_, dr, _) -> Just dr)

lifeExpectancy :: LifeTable -> Age -> Maybe LifeExpectancy
lifeExpectancy lifeTable age = lookup age lifeTable >>= (\(_, _, le) -> Just le)

With this implementation, you can create a life table by providing a list of age-specific death rates and query it for mortality rates and life expectancies at different ages.

This conversation may have been edited by the sharer.

Bot image for GPT-4Talk to GPT-4 on Poe