puts synthesize( Expression::LiteralInt.new(42), Context.empty ) # => # puts synthesize( Expression::Annotation.new( Expression::LiteralString.new("hello"), Type::String.new ), Context.empty ) # => # puts synthesize( Expression::Annotation.new( Expression::Lambda.new("x", Expression::Variable.new("x")), Type::Quantification.new("a", Type::Lambda.new(Type::Variable.new("a"), Type::Variable.new("a"))) ), Context.empty ) # => #, body_type=#>> id = Expression::Annotation.new( Expression::Lambda.new("x", Expression::Variable.new("x")), Type::Quantification.new("a", Type::Lambda.new(Type::Variable.new("a"), Type::Variable.new("a"))) ) call42 = Expression::Annotation.new( Expression::Lambda.new( "f", Expression::Application.new(Expression::Variable.new("f"), Expression::LiteralInt.new(42)) ), Type::Lambda.new( Type::Lambda.new(Type::Int.new, Type::Int.new), Type::Int.new ) ) puts infer(Expression::Application.new(call42, id)) # => #