Haskell按fst分组列表元素

Mar*_*cin 4 haskell list-comprehension

我正在尝试编写一个函数

group::[(Int, Int)]->[[(Int, Int)]]
Run Code Online (Sandbox Code Playgroud)

这会将元组列表的元素分组为依赖于第一个坐标的子组,即:

group [(1,1),(1,2),(2,1),(2,2),(2,3)]
Run Code Online (Sandbox Code Playgroud)

应该导致

[[(1,1),(1,2)],[(2,1),(2,2),(2,3)]]
Run Code Online (Sandbox Code Playgroud)

我认为列表理解是方式,但我有点卡住..有人可以提供建议/解决方案吗?

PS函数也可以将第一个坐标可以取的最大值作为参数,如果有任何帮助的话

Fre*_*abe 8

你可以使用 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)]]
Run Code Online (Sandbox Code Playgroud)

这个on函数在这里用来缩短代码而不会混淆它:

?: groupBy ((==) `on` fst) [(1,1),(1,2),(2,1),(2,2),(2,3)]
[[(1,1),(1,2)],[(2,1),(2,2),(2,3)]]
Run Code Online (Sandbox Code Playgroud)