puti ::= fn(x: int) { #C("printf(\"%ld\\n\", x)"); }; putf ::= fn(x: float) { #C("printf(\"%f\\n\", x)"); }; t ::= fn(a:: Type) Type {a}; f ::= fn(b::=, u::=, a:t(b), x:t(u)) int{ ((3 as b) as u) as int }; main ::= fn() { x : t(int) = 3; y : t(float) = 3.4; puti(f(x,y)); };