interface Numeric {
    fn add(a: Self, b: Self) -> Self;
    fn sub(a: Self, b: Self) -> Self;
}

implement Numeric for Int;
implement Numeric for Float;

fn add(a: Int, b: Int) -> Int {
    return 0;
}

fn sub(a: Int, b: Int) -> Int {
    return 0;
}

fn add(a: Float, b: Float) -> Float {
    return 0.0;
}

fn sub(a: Float, b: Float) -> Float {
    return 0.0;
}

fn<T> test(n: 'T [Numeric]) -> Bool {
    return true;
}

test(3);
test(3.5);