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 t1 t2 = 
    let t1' = standardize t1
        t2' = standardize t2
    in  zipWith' f t1' t2'
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 t1 t2 = 
    let t1' = standardize t1
        t2' = standardize t2
    in  zipWith' f t1' t2'
zipWith f t1 t2 = 
    let t1' = standardize t1
        t2' = standardize t2
    in  zipWith' f t1' t2'