use cmp::Eq; trait MyNum : Add Sub Mul Eq { } struct MyInt { val: int } impl MyInt : Add { pure fn add(&self, other: &MyInt) -> MyInt { mi(self.val + other.val) } } impl MyInt : Sub { pure fn sub(&self, other: &MyInt) -> MyInt { mi(self.val - other.val) } } impl MyInt : Mul { pure fn mul(&self, other: &MyInt) -> MyInt { mi(self.val * other.val) } } impl MyInt : Eq { pure fn eq(&self, other: &MyInt) -> bool { self.val == other.val } pure fn ne(&self, other: &MyInt) -> bool { !self.eq(other) } } impl MyInt : MyNum; fn f(x: T, y: T) -> (T, T, T) { return (x + y, x - y, x * y); } pure fn mi(v: int) -> MyInt { MyInt { val: v } } fn main() { let (x, y) = (mi(3), mi(5)); let (a, b, c) = f(x, y); assert a == mi(8); assert b == mi(-2); assert c == mi(15); }