Haskell 如何比较列表中的两个元组?

Haskell 如何比较列表中的两个元组?,haskell,Haskell,我有这样的元组列表: [(0.0,0.0),(1.0,0.0),(2.0,0.0),(3.0,0.0),(3.0,0.0),(3.0,0.0),(4.0,0.0),(4.0,0.0)] 其中第一个元素是X坐标,第二个元素是Y坐标,我现在想写一个函数,返回: [(0.0,0.0),(1.0,0.0),(2.0,0.0),(3.0,0.0),(3.0,1.0),(3.0,2.0),(4.0,0.0),(4.0,1.0)] 它从第一个元组获取第一个元素,从第二个元组获取第一个元素,如果它们不相等,

我有这样的元组列表:

[(0.0,0.0),(1.0,0.0),(2.0,0.0),(3.0,0.0),(3.0,0.0),(3.0,0.0),(4.0,0.0),(4.0,0.0)]
其中第一个元素是X坐标,第二个元素是Y坐标,我现在想写一个函数,返回:

[(0.0,0.0),(1.0,0.0),(2.0,0.0),(3.0,0.0),(3.0,1.0),(3.0,2.0),(4.0,0.0),(4.0,1.0)]
它从第一个元组获取第一个元素,从第二个元组获取第一个元素,如果它们不相等,Y不变,但如果它们相等,我们将向Y添加一个元素


如果有人知道如何用Haskell写作?

未经测试,但类似的方法可以:

foo :: [(Float, Float)] -> [(Float, Float)]
foo []  = []
foo [x] = [x]
foo ((xx, xy):(yx, yy):xs) = (xx, xy): theTuple : (foo ((yx, yy):xs))
    where
        theTuple = if xx == yx then (yx, yy) else (yx, yy+1)

听起来您可能受益于
groupBy
Data.List中的co等函数。看看这个模块,看看是否有什么东西能让你知道如何解决这个问题。我在考虑lambda和map,但我不知道如何将它与检查列表中的元组结合起来。试着编写处理算法每个部分的小函数。例如,编写一个函数,当且仅当第一个元素相同时,它接受两个元组并递增第二个元素。那么结果如何?结果的类型是什么?从你的描述来看有点不清楚。你知道如何对元组进行模式匹配吗?你确定不想将[0,1,2,3,3,3,4,4]改为[(0,0),(1,0),(2,0),(3,0),(3,1),(3,2),(4,0),(4,1)]?在你做了任何算术之后,双精度对等式检查来说都不是很好,而且你似乎不需要初始的y。如果我是对的,您需要
concatMap
邮政编码和
[0..]
。你可以在hoogle/hayoo上找到前三个,你可以在google上找到。