如何对haskell进行分组和计数?

tian

给定一个列表(例如[1,2,2,3,3,4,5,6]),如何根据箱/范围对它们进行分组和计数?我希望能够指定一个范围,以便:

假设range = 2,并使用前面的列表,将给出[1, 4, 2, 1]1 0或1、4 2或3、2 4或5以及1 6或7。

假设range = 4,并使用前面的列表,将给我[5,3],假设有5个0或1或2或3,3个4或5或6或7个。

我已经调查groupgroupBy,但没有找到合适的谓词,也直方图填充库。后者对于创建垃圾箱似乎非常好,但是我无法找到如何将数据加载到这些垃圾箱中。

我该如何实现?

我对以下建议之一的尝试:

import Data.List 
import Data.Function 

quantize range n = n `div` range  

main = print (groupBy ((==) `on` quantize 4) [1,2,3,4,2]) 

当其应为[[1,2,2,3],[4]]时,输出为[[1,2,3],[4],[2]]。以下两个建议都适用于排序列表。

main = print (groupBy ((==) `on` quantize 4) (sort [1,2,3,4,2]))   
卢基

您需要量化以获取垃圾箱的定义。

-- `quantize range n` rounds n down to the nearest multiple of range
quantize :: Int -> Int -> Int

groupBy带有一个“谓词”参数*,它标识是否应将两个项目放在同一容器中。所以:

groupBy (\n m -> quantize range n == quantize range m) :: [Int] -> [[Int]]

会根据元素是否在同一个容器中对元素进行分组,而不更改元素。如果range是2,那会给你类似的东西

[[1],[2,2,3,3],[4,5],[6]]

然后,您只需要获取length每个子列表的即可。

*调用了一个整洁的函数on,使您可以更简洁地编写谓词

groupBy ((==) `on` quantize range)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章