【问题标题】:How to compare two tuple in list?如何比较列表中的两个元组?
【发布时间】:2016-11-22 12:42:12
【问题描述】:

我有这样的元组列表:

[(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 编写代码?

【问题讨论】:

  • 听起来您可能会受益于 groupByData.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。如果我是对的,你想要groupconcatMapzip[0..]。您可以在 hoogle/hayoo 上找到前三个,您可以在 google 上找到。

标签: haskell


【解决方案1】:

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

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)

【讨论】:

    猜你喜欢
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 2020-07-04
    • 1970-01-01
    相关资源
    最近更新 更多