module Convolution ( convolve ) where ip :: Num a => [a] -> [a] -> a ip [] ys = 0 ip xs [] = 0 ip (x:xs) (y:ys) = x*y + ip xs ys pad :: [a] -> [a] -> [a] pad x y = (replicate ((length y) - 1) 0) ++ x heads :: [a] -> [[a]] heads [x] = [[x]] heads xs= xs : heads (init xs) convolve :: (Num a) => [a] -> [a] -> [a] convolve _ [] = [] convolve [] _ = [] convolve as bs = let padas = pad as bs padbs = pad bs as in zipWith (ip) (init $ tails padas) (heads $ reverse padbs) -- To compile an executable a [[main]] definition is needed for input and output. -- I don't want to think about this right now .