まず,foldrとmapはそれぞれ.
foldr f e [] = e
foldr f e (a:x) = f a (foldr f e x)
map g [] = []
map g (a:x) = g a : map g x
のようなカンジ.
さらに,foldrの定義から
foldr (f.g) e [] = e
foldr (f.g) e (a:x) = (f.g) a (foldr (f.g) e x)
foldr/mapの合成関数を,それぞれの定義から変換していくと,
(foldr f e.map g) []
{関数合成の定義}
=> foldr f e (map g [])
{mapの定義}
=> foldr f e []
{foldrの定義}
=> e
(foldr f e.map g) (a:x)
{関数合成の定義}
=> foldr f e (map g (a:x))
{mapの定義}
=> foldr f e (g a : map g x)
{foldrの定義}
=> f (g a) (foldr f e (map g x))
{関数合成の定義}
=> (f.g) a ((foldr f e.map g) x)
なので,
(foldr f e.map g) [] = e
(foldr f e.map g) (a:x) = (f.g) a ((foldr f e.map g) x)
比較すれば,
foldr f e.map g = foldr (f.g) e
であることがわかると思います.scanrも同様です.