39 lines
691 B
Agda
39 lines
691 B
Agda
module Auto2
|
|
|
|
ptype World
|
|
pfunc log : {A : U} -> A -> World := `(_, a) => console.log(a)`
|
|
|
|
ptype Int
|
|
pfunc i_plus : Int -> Int -> Int := `(x,y) => x + y`
|
|
|
|
data Nat : U where
|
|
Z : Nat
|
|
S : Nat -> Nat
|
|
|
|
plus : Nat -> Nat -> Nat
|
|
plus Z x = x
|
|
plus (S k) x = S (plus k x)
|
|
|
|
-- a type class
|
|
data Add : U -> U where
|
|
MkAdd : {A : U} -> (A -> A -> A) -> Add A
|
|
|
|
infixl 8 _+_
|
|
_+_ : {A : U} -> {{myadd : Add A}} -> A -> A -> A
|
|
_+_ {_} {{MkAdd adder}} x y = adder x y
|
|
|
|
-- Two instances
|
|
addInt : Add Int
|
|
addInt = MkAdd i_plus
|
|
|
|
addNat : Add Nat
|
|
addNat = MkAdd plus
|
|
|
|
-- sequencing hack
|
|
infixl 2 _>>_
|
|
_>>_ : {a b : U} -> a -> b -> b
|
|
a >> b = b
|
|
|
|
main : World -> World
|
|
main _ = log (40 + 2) >> log (Z + Z)
|