给定一个列表列表,我想找到一个特定元素出现在其中一个子列表中的最大次数。
所以给定[[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:)
答案 0 :(得分:7)
您只需要将length
和filter (==4)
与.
合并,而不是$
,因为length
和filter (==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风格。