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