// MARK: Summation

prefix operator ∑
public prefix func ∑ <T>(values: [T]) -> T where T : Numeric & ExpressibleByIntegerLiteral {
    return values.reduce(0, +)
}

// MARK: Cartesian Product

prefix operator ∏
public prefix func ∏ <T>(values: [T]) -> T where T : Numeric & ExpressibleByIntegerLiteral {
    return values.reduce(1, *)
}

// MARK: Summation

prefix operator ∑
public prefix func ∑ <S: Sequence>(values: S) -> S.Element where S.Element : Numeric & ExpressibleByIntegerLiteral {
    return values.reduce(0, +)
}

// MARK: Cartesian Product

prefix operator ∏
public prefix func ∏ <S: Sequence>(values: S) -> S.Element where S.Element : Numeric & ExpressibleByIntegerLiteral {
    return values.reduce(1, *)
}

Redefine Summation and Cartesian Product operators in terms of Sequence type
Redefine Summation and Cartesian Product operators in terms of Sequence type
