在过滤器内使用长度时输入错误

时间:2015-12-24 03:15:35

标签: haskell

给定一个列表列表,我想找到一个特定元素出现在其中一个子列表中的最大次数。

所以给定[[1,4],[4,3],[1,4,4,3]]我希望输出为2,因为数字4在其中一个子列表中出现两次(并且不超过两次)。

我的方法是从子列表中删除所有不是4的数字,然后获取所有子列表的最大长度。第一步是好的:

map (filter (==4)) [[1,4],[4,3],[1,4,4,3]]

但添加length会给我一个错误:

map (length $ filter (==4)) [[1,4],[4,3],[1,4,4,3]]
Couldn't match expected type ‘[Integer] -> b’
            with actual type ‘Int’
Relevant bindings include it :: [b] (bound at <interactive>:11:1)
In the first argument of ‘map’, namely ‘(length $ filter (== 4))’
In the expression:
  map (length $ filter (== 4)) [[1, 4], [4, 3], [1, 4, 4, ....]]
In an equation for ‘it’:
    it = map (length $ filter (== 4)) [[1, 4], [4, 3], [1, 4, ....]]

为什么这不起作用? - 如果你没注意到Haskell noob:)

1 个答案:

答案 0 :(得分:7)

您只需要将lengthfilter (==4).合并,而不是$,因为lengthfilter (==4)都是函数,而不是函数和值,您使用$

所以你有:

map (length . filter (==4)) [[1,4],[4,3],[1,4,4,3]]

或者,这也适用:

map (\x -> length $ filter (==4) x) [[1,4],[4,3],[1,4,4,3]]

但请注意,在这种情况下,您将filter (==4) x应用于length并且filter (==4) x是一个值本身,而不是一个函数,因此$是正确的构图运营商。

但我认为前者是更好的Haskell风格。