给定一个列表列表,我想找到一个特定元素出现在其中一个子列表中的最大次数.
因此,[[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: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 :)
你只需要编写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风格.