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)
正确的构成将是:
(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)
| 归档时间: |
|
| 查看次数: |
160 次 |
| 最近记录: |