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

4
我正在尝试编写一个函数。
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)]]

我想使用列表推导式来实现,但我有些困惑... 有人能提供建议/解决方案吗?
PS:如果需要的话,该函数还可以将第一个坐标的最大值作为参数。
1个回答

7
您可以使用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)]]

这对于groupBy ((==) `on` fst) [(1,1),(1,2),(2,1),(2,2),(1,3)]不起作用。如果您想要这样做,您会提前进行排序吗? - tcotts
@tcotts 是的,如果你想让所有具有相同第一个元素的元组都在一组中(而不仅仅是连续元组的运行),那么你需要先进行排序。 - Frerich Raabe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接