foldl/foldr

Haskellのfold(l|r)は、なぜfoldx binop [...]ではなくfoldx binop init [...]という具合に初期値を必要とするのか、その理由を述べよ。

さて、なんでだろう。リストの要素の型が T だとして、foldx binop [...] だと binop が T -> T -> T で、結果も T じゃないといけないから?
要するに初期値ありだと、

foldl :: (b -> a -> b) -> b -> [a] -> b
foldr :: (a -> b -> b) -> b -> [a] -> b

で、計算過程の型をリストの要素とは別の型にできるけど、初期値なしだと、

foldx :: (a -> a -> a) -> [a] -> a

で、計算過程の型をリストの要素の型と一致させることが強制されるという。