【发布时间】:2021-10-28 03:06:05
【问题描述】:
我的目标是接受如下输入:
[(8, P1), (8, P2), (10, P3)]
然后把它变成这样的东西:
[(8, [P1, P2]), (10, P3)]
假设8 和10 之类的数字是数据类型Time(包装和Int),P1 和P2 是数据类型Person(包装String)。这是我到目前为止所做的:
groupTogether :: [(Time, Person)] -> [(Time, Person)]
groupTogether [] = []
groupTogether ((x, y) : (a, b) : ks)
| x == a = (x, (y : (b))) : groupTogether ks
| otherwise = (x, y) : groupTogether ((a, b) : ks)
而且它“有点”有效,但通常输出是 (8, Name1Name2) 而不是 (8, [Name1, Name1])。而且我只是不知道一旦列表中只有一个元素,该函数应该做什么。它说缺少“详尽的模式”。我究竟做错了什么?如果我尝试使用 : 将元素放在一起,代码将无法运行。
【问题讨论】:
-
如果输入是
[(8, P1), (10, P3), (8, P2)],这意味着结果是[(8, [P1]), (10, [P3]), (8, [P2])]还是[(8, [P1, P2]), (10, [P3])]? -
@WillemVanOnsem 输出应该是 [(8, [P1, P2]), (10, [P3])] 当元组的第一个元素匹配时将字符串组合成一个列表。
-
[(8, P1), (10, P3), (8, P2)]应该变成什么? -
[(8, P2), (8, P1), (8, P2)]怎么样