 func ⋅ (left: [Double], right: [Double]) -> Double {
     precondition(left.count == right.count, "arguments must have same count")
 
-    var product: [Double] = []
-    for (index, _) in enumerate(left) {
-        let (a, b) = (left[index], right[index])
-        product.append(a * b)
-    }
-
+    let product = zip(left, right).map { (l, r) in l * r }
     return ∑product
 }
 


infix operator ∈ { associativity left }
func ∈<T: Equatable> (left: T, right: [T]) -> Bool {
    return contains(right, left)
}

func ∈<T> (left: T, right: Set<T>) -> Bool {

// MARK: Nth Derivative

infix operator ′ { associativity left }
func ′(left: (Double -> Double), right: UInt) -> (Double) -> (Double) {
    return (0 ..< right).reduce(left) { (function, _) in
        return function′
    }
}
