packages feed

purescript-0.6.4.1: examples/passing/FinalTagless.purs

module Main where

import Prelude

class E e where
  num :: Number -> e Number
  add :: e Number -> e Number -> e Number

type Expr a = forall e. (E e) => e a

data Id a = Id a

instance exprId :: E Id where
  num = Id
  add (Id n) (Id m) = Id (n + m)

runId (Id a) = a

three :: Expr Number
three = add (num 1) (num 2)

main = Debug.Trace.print $ runId three