15/06/09 14:28:52.87 keQMp1Zr.net
まずscanlに相当するものをmyScanl f r xs = ys where ys = r: zipWith f ys xsとして作ります。
zipWith f ys xsをmapを使って書き換えればmap (\(x,y) -> f y x) (zip xs ys)となりますから、
myScanl f r xs = ys where ys = r: map (\(x,y) -> f y x) (zip xs ys)となります。
scanlで得られたリストの最後の要素がfoldlつまりreduceの結果になりますから、
reduce f r xs = last ys where ys = r: map (\(x,y) -> f y x) (zip xs ys)で望みのものが得られます(reduce (+) 0 [1..9] → 45)。
もちろん再帰をこのようにまわりくどく用いた定義をせずに簡明な普通の再帰で書くべきです