To cut the story short, the abstract solution looks like this: \begin{haskellcode} fold :: b -> (a -> b -> b) -> [a] -> b fold z f [] = z fold z f (x:xs) = f x (fold z f xs) \end{haskellcode} Whoa! What's going on here?\\ Let's see... \begin{itemizep} \item \code{z} is what we return if the list is empty \item \code{f} is our function (e.g. \code{(*)} or \code{(+)}) \item and the last remaining argument is the actual list we are working on \end{itemizep} \slidep The function application has the following form:\\ \code{fold f z [a,b,c] == a `f` (b `f` (c `f` z))} \vspace{\baselineskip} \\ This folds from the right, so the \emph{Prelude} already defines a function which is very similar to ours and called \textbf{foldr}.