当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在过滤器内使用长度时输入错误》经验,为你挑选了1个好方法。

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

因此,[[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 :)



1> Clinton..:

你只需要编写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,以lengthfilter (==4) x为价值本身,而不是一个功能,所以$是正确的复合算.

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

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有