Yet Another Haskell Tutorial の続き3

Yet Another Haskell Tutorial のExerciseの続きです。ようやく半分過ぎたくらいです。
今回の 7章で、FiniteMapというTypeが出てくるのですが、これは新しいHaskellでは Data.Mapに変わったのですかね?現在では FiniteMapはなくなっているようでした。

Exercise 7.1 Convert the following functions into point-free style, if possible.

-- func1 x l = map (\y -> y*x) l
-- func1 x = map (\y -> y*x)
-- func1 x = map (*x)
func1 = map . (*)

-- func2 f g l = filter f (map g l)
func2 f g = filter f . map g

-- func3 f l = l ++ map f l
-- これ以上変わらない。

-- func4 l = map (\y -> y+2)
--               (filter (\z -> z `elem` [1..10])
--                       (5:l))
func4 = map (+2) . filter (`elem` [1..10]) . (5:)

-- func5 f l = foldr (\x y -> f (y,x)) 0 l
func5 f = foldr (flip $ curry f) 0

Exercise 7.2 The function and takes a list of booleans and returns True if and only
if all of them are True. It also returns True on the empty list. Write this function in
terms of foldr.

and = foldr (&&) True

Exercise 7.3 The function concatMap behaves such that concatMap f is the same
as concat . map f. Write this function in terms of foldr.

-- お題
-- concatMap f = concat . map f

-- 再帰での書き換え
-- concatMap f []     = []
-- concatMap f (x:xs) = f x ++ concatMap f xs

-- さらに foldrに書き換え
-- concatMap f = foldr (\a b -> f a ++ b) []
-- concatMap f = foldr (\a -> (++) (f a)) []
concatMap f = foldr ((++) . f) []