purescript-0.6.4.1: examples/passing/Rank2Data.purs
module Main where
import Prelude
data Id = Id forall a. a -> a
runId = \id a -> case id of
Id f -> f a
data Nat = Nat forall r. r -> (r -> r) -> r
runNat = \nat -> case nat of
Nat f -> f 0 (\n -> n + 1)
zero = Nat (\zero _ -> zero)
succ = \n -> case n of
Nat f -> Nat (\zero succ -> succ (f zero succ))
add = \n m -> case n of
Nat f -> case m of
Nat g -> Nat (\zero succ -> g (f zero succ) succ)
one = succ zero
two = succ zero
four = add two two
fourNumber = runNat four
main = Debug.Trace.trace "Done"