昨日は第六回Haskell読書会に行ってきた。参加された皆様お疲れ様でした。
演習問題7.5
sumsqreven compose [sum,map (^2),filter even]が間違っている理由を述べよ
という問題で
compose :: [a -> a] -> (a -> a)
compose = foldr (.) id
composeはa -> aという型の関数のリストを引数として取る。
ここで
Prelude> :t (map (^2))
(map (^2)) :: (Num a) => [a] -> [a]
Prelude> :t (filter even)
(filter even) :: (Integral a) => [a] -> [a]
Prelude> :t sum
sum :: (Num a) => [a] -> a
となりsumだけ [a] -> aという型なのでダメ。
sumがなければOKで、これは
:t compose [(map (^2)),(filter even)]
compose [(map (^2)),(filter even)] :: (Integral a) => [a] -> [a]
という型になる。
7章で感じたのはfoldr,foldlがさくっと出てきて戸惑うのと、関数合成がさらっと流しすぎなとこ。foldl,foldrは知っているのが前提なのかな?と思った。
SICPの1,2章でも読んでおけば違うかも。
関数合成は他の本を読みましょう。
8章はちょっと難しいので、次回は予習して臨む。