Haskell 按 fst 对列表元素进行分组

Haskell grouping list elements by fst

我正在尝试编写一个函数

group::[(Int, Int)]->[[(Int, Int)]]

根据第一个坐标将元组列表的元素分组到子组中,即:

group [(1,1),(1,2),(2,1),(2,2),(2,3)]

应该导致

[[(1,1),(1,2)],[(2,1),(2,2),(2,3)]]

我想列表理解就是这样,但我有点卡住了..有人可以提供 advice/solution 吗?

PS 该函数还可以将第一个坐标可以采用的最大值作为参数,如果这有任何帮助的话

您可以使用 groupBy

λ: groupBy (\x y -> fst x == fst y) [(1,1),(1,2),(2,1),(2,2),(2,3)]
[[(1,1),(1,2)],[(2,1),(2,2),(2,3)]]

on 函数在这里很有用,可以稍微缩短代码而不混淆它:

λ: groupBy ((==) `on` fst) [(1,1),(1,2),(2,1),(2,2),(2,3)]
[[(1,1),(1,2)],[(2,1),(2,2),(2,3)]]