我仍然是haskell的新手,但我努力学习它。但是现在我明白了,我认为我必须学习haskell的全新章节。有条件地合并列表元素
所以这是一个包含这些数字Int的列表的列表:
[[5,6,14],[1,2,9],[11,12,13],[6,13,14],[5,13,14]]
在开始的时候所有内部列表包含三个数字。目标是将所有重叠列表合并为更大的列表:
[[5,6,14],[1,2,9],[11,12,13],[6,13,14],[5,13,14]]
merging elements at index 0 and 3 because of the common 6 in both lists.
[[5,6,14,13],[1,2,9],[11,12,13],[5,13,14]]
merging elements at index 0 and 2 because of the common 13 in both lists.
[[5,6,14,13,11,12],[1,2,9],[5,13,14]]
merging elements at index 0 and 2 because of the common 5,13 & 14 in both lists.
[[5,6,14,13,11,12],[1,2,9]]
而这应该是函数的结果。列表内部列表的顺序与最内部列表中元素的顺序无关。
我知道如何在任何其他命令式语言中对其进行编码,但在这里我卡住了。
不在于它回答你的问题,但你应该知道,Haskell的列表('[A]')是*不*阵列,而是链表,而这些的当然具有与阵列完全不同的性能特征。如果你真的想要数组(可能不是这种情况下),请查看[vector](https://hackage.haskell.org/package/vector),这几乎是目前阵列的典型选择。 – gspr
你似乎也会做很多会员测试。也许你想考虑['Set'](http://hackage.haskell.org/package/containers-0.5.6.3/docs/Data-Set.html),这种检查可以在对数时间完成。 – gspr
下面是一个草图:1)编写一个函数,如果它们有交集,则合并两个集合。 2)编写一个函数,从两个列表中产生所有元素对的列表。 3)将函数从1传递到2,直到它找到一对可以完成它的事情。如果你在没有做任何事情的情况下遍历2的所有列表,你就完成了。 – gspr