Haskell:函数组合的类型不匹配

met*_*eto 2 haskell types functional-programming combinators function-composition

我在功能构成和类型方面遇到了一些麻烦.我想撰写filter(返回一个列表)len,其中列表作为参数(技术上是一个,Foldable但我在这里简化).查看类型一切都如预期:

> :t length
length :: Foldable t => t a -> Int

> :t filter
filter :: (a -> Bool) -> [a] -> [a]
Run Code Online (Sandbox Code Playgroud)

所以现在我期待的类型(len . filter)

(length . filter) :: (a -> Bool) -> [a] -> Int
Run Code Online (Sandbox Code Playgroud)

而实际上是

> :t (length . filter)
(length . filter) :: Foldable ((->) [a]) => (a -> Bool) -> Int
Run Code Online (Sandbox Code Playgroud)

所以我似乎失去了一些论点.是否Foldable以某种方式包含在要求中我不理解?

请注意,如果我进行部分应用,一切都按预期工作:

> let myFilter = filter odd
> :t myFilter
myFilter :: Integral a => [a] -> [a]
> :t (length . myFilter)
(length . myFilter) :: Integral a => [a] -> Int
>  (length . myFilter) [1,2,3]
2
Run Code Online (Sandbox Code Playgroud)

beh*_*uri 5

正确的构成将是:

(length .) . filter :: (a -> Bool) -> [a] -> Int
Run Code Online (Sandbox Code Playgroud)

这相当于:

\pred xs -> length $ filter pred xs
Run Code Online (Sandbox Code Playgroud)

如:

\> let count = (length .) . filter
\> :type count
count :: (a -> Bool) -> [a] -> Int
\> count odd [1..3]
2
\> count even [1..3]
1
Run Code Online (Sandbox Code Playgroud)