-- 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