iface to_str { fn to_str() -> str; } impl of to_str for int { fn to_str() -> str { int::str(self) } } impl of to_str for str { fn to_str() -> str { self } } impl of to_str for () { fn to_str() -> str { "()" } } iface map { fn map(f: fn(T) -> U) -> ~[U]; } impl of map for ~[T] { fn map(f: fn(T) -> U) -> ~[U] { let mut r = ~[]; for self.each {|x| r += ~[f(x)]; } r } } fn foo>(x: T) -> ~[str] { x.map({|_e| "hi" }) } fn bar>(x: T) -> ~[str] { x.map({|_e| _e.to_str() }) } fn main() { assert foo(~[1]) == ~["hi"]; assert bar::(~[4, 5]) == ~["4", "5"]; assert bar::(~["x", "y"]) == ~["x", "y"]; assert bar::<(), ~[()]>(~[()]) == ~["()"]; }