の型を思い出してください(.)
。
(.) :: (b -> c) -> (a -> b) -> a -> c
2 つの関数と初期値の 3 つの引数を取り、合成された 2 つの関数の結果を返します。
これで、引数への関数の適用は、(.)
演算子よりも厳密にバインドされます。だからあなたの表現:
map (*2) . filter even [1,2,3,4]
次のように解析されます。
(.) (map (*2)) (filter even [1,2,3,4])
これで、最初の引数は問題map (*2)
ありません。type (b -> c)
、 where b
、c
is がありNum a => [a]
ます。ただし、2 番目の引数は単一のリストです。
Prelude> :t filter even [1,2,3,4]
filter even [1,2,3,4] :: Integral a => [a]
そのため、型チェッカーは、関数が関数を必要とする[a]
ときに引数としてa を渡していると文句を言うでしょう。(.)
そして、それが私たちが見るものです:
Couldn't match expected type `a0 -> [b0]' with actual type `[a1]'
In the return type of a call of `filter'
In the second argument of `(.)', namely `filter even [1, 2, 3, 4]'
In the expression: map (* 2) . filter even [1, 2, 3, 4]
だから... 括弧!
演算子を使用し$
て括弧を追加します。
map (*2) . filter even $ [1,2,3,4]
または明示的な括弧を使用して、2 つの関数の構成を削除します
map (*2) (filter even [1,2,3,4])
あるいは:
(map (*2) . filter even) [1,2,3,4]