assert fun is type assert fun is type assert fun<:int> is type assert fun is type assert fun< fun<:> : int> is type let a = fun (x as int, y as int) as int 0 end assert a is fun assert !(a is fun<:>) let b = fun (x as int) as int return x * 7 end assert 42 == b 6 let c = fun () as int return 3 * 6 end assert 18 == *c let d = fun () as int return 43 27 end assert 43 == *d fun e (n as int) as int return n * 2 end assert 14 == e 7 fun f (n as int) as int if n == 0 return 1 end return n * f(n - 1) end assert 120 == f 5 fun h (n as int, m as fun) as int return (m (m n)) end fun i (n as int) as int return n * 3 end assert 27 == h 3, i fun j (n as int) as int fun j_inner (n as int) as int return n * 2 end return j_inner (j_inner n) end assert 32 == j 8