trait 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 { ~"()" } } trait 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::<~str, ~[~str]>(~[~"x", ~"y"]) == ~[~"x", ~"y"]; assert bar::<(), ~[()]>(~[()]) == ~[~"()"]; }