haskell 如何在元组列表中使用groupBy?

6za6bjd0  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(128)

我如何按元组的第二个元素对该列表进行分组:

[(3,2),(17,2),(50,3),(64,3)]

得到如下结果:

[[(3,2),(17,2)],[(50,3),(64,3)]]

我其实是一个新来的 haskell ......似乎爱上了它。希望你能帮助我找到一个有效的方法。

ruarlubt

ruarlubt1#

听起来好像您已经确定需要Data.List.groupBy

groupBy :: (a -> a -> Bool) -> [a] -> [[a]]

所以它需要一个二元 predicate ,也就是一个等价关系来决定如何对元素进行分组。

groupBy (\x y -> snd x == snd y) myList

其中snd是一个内置函数,用于获取元素对中的第二个元素。
顺便说一句,这种“将一个函数应用于两个参数,然后将一个二进制函数应用于结果”的模式 * 非常 * 常见,尤其是在调用Data.List函数时,因此Data.Function提供on

on :: (b -> b -> c) -> (a -> b) -> a -> a -> c

奇怪的签名,但用例正是我们想要的。

((+) `on` f) x y = f x + f y

因此,您所需的groupBy可以写为

groupBy ((==) `on` snd)

请注意,groupBy只查找 consecutive equal元素,您没有指明您是想要连续的equal元素还是 all equal元素,但如果您想要后者,那么我不相信Haskell base提供了该函数,尽管您可以自己递归地编写它。

相关问题