-- V ::= [C] | 0 | V + V' | 1 | V * V'
-- C ::= {V} | V -> C | top | C & C'
neg : [ int -> {int} ]
add : [ int -> int -> {int} ]
abs : [ int -> {int} ]
abs = [ \ n: int.
if n < 0
then {0 - n}
else {n}
]
add : [ int -> {int} ]
add = [ \ (x: int) (y: int) . { x + y } ]
data List a where
Nil : List a
Cons : a -o List a -o List a
nums : List Int
nums = Cons(1, Cons(2, Cons(3, Nil)))
-- fn name arg1 arg2 ... argn = blah
-- ==>
-- name = [ \ arg1 arg2 ... argn . blah ]
sumlist : [ List Int -> {Int} ]
fn sumlist (Cons x xs) = let y <- sumlist xs in { x + y }
sumlist Nil = { 0 }
data Tree where
Leaf : Int -o Tree
Node : Tree * Tree -o Tree
codata Stream a where
.head : {a}
.tail : Stream
ones : Stream Int
ones = rec this
this.head <- {1}
this.tail <- this