packages feed

purescript-0.6.8: 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'"