packages feed

purescript-0.15.15: tests/purs/passing/FinalTagless.purs

module Main where

import Prelude hiding (add)
import Effect.Console (log, logShow)

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.0) (num 2.0)

main = do
  logShow $ runId three
  log "Done"