foldl _ v [] = v
foldl f v (x:xs) = foldl f (f v x) xs

sum = foldl (+) 0
product = foldl (*) 1
reverse = foldl (\ys x -> x:ys) []
length = foldl (\n _ -> n + 1) 0

再利用出来すぎ
LLだって、オブジェクト指向の機能のみではここまで再利用は出来まい