zipWith' :: (
    Multilinear Tensor a, Multilinear Tensor b, Multilinear Tensor c, 
    NFData a, NFData b, NFData c
    ) => (a -> b -> c) 
      -> Tensor a 
      -> Tensor b 
      -> Tensor c
-- Zipping two Scalars simply combines their values 
zipWith' f (Scalar x1) (Scalar x2) = Scalar $ f x1 x2
zipWith' :: (
    Multilinear Tensor a, Multilinear Tensor b, Multilinear Tensor c, 
    NFData a, NFData b, NFData c
    ) => (a -> b -> c) 
      -> Tensor a 
      -> Tensor b 
      -> Tensor c
zipWith' f (Scalar x1) (Scalar x2) = Scalar $ f x1 x2
zipWith' f (Scalar x1) (Scalar x2) = Scalar $ f x1 x2