Skip to content

Instantly share code, notes, and snippets.

@axelGschaider
Created August 31, 2012 19:32
Show Gist options
  • Save axelGschaider/3557917 to your computer and use it in GitHub Desktop.
Save axelGschaider/3557917 to your computer and use it in GitHub Desktop.
The infamous rocket example for phantom types. With support for real oxygen/fuel data
data NoFuel
data Fueled
data NoO2
data HasO2
data Rocket fuel o2 = Rocket { fuel:: Int
, o2 :: Int }
createRocket :: Rocket NoFuel NoO2
createRocket = Rocket 0 0
addFuel :: Int -> Rocket NoFuel o2 -> Rocket Fueled o2
addFuel f r = Rocket f $ o2 r
addO2 :: Int -> Rocket fuel NoO2 -> Rocket fuel HasO2
addO2 o r = Rocket (fuel r) o
launch :: Rocket Fueled HasO2 -> String
launch x = "we are gonna last " ++ (show $ daysToTravel x) ++ " days"
daysToTravel :: Rocket fueled hasO2 -> Int
daysToTravel r = min (fuel r) (o2 r)
a |> b = b a
main = do print $ createRocket |> addFuel 500 |> addO2 300 |> launch
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment