使用Haskell在功能上将数据集相互比较一次

时间:2012-11-13 17:20:11

标签: performance haskell functional-programming dataset comparison

经过一年多的精神争吵,我终于明白了Haskell,认为它是我的大部分编程需求的主要语言。我非常喜欢它。

但我仍然在努力以功能方式进行非常具体的操作。

简化示例:

Set = [("Bob", 10), ("Megan", 7), ("Frank", 2), ("Jane", 11)]

我想将这些条目相互比较。使用像C或Python这样的语言,我可能会创建一些复杂的循环,但是我不确定哪种方法(map,fold,list comprehension?)对于函数式语言来说是最好的还是最有效的。

以下是我开始处理的代码示例:

run xs = [ someAlgorithm (snd x) (snd y) | x <- xs, y <- xs, x /= y ]

谓词使列表理解与自己比较条目保持一致,但该函数效率不高,因为它比较了已经比较的条目。例如。它会将Bob与Megan进行比较,然后将Megan与Bob进行比较。

非常感谢任何有关如何解决此问题的建议。

1 个答案:

答案 0 :(得分:8)

如果您对数据类型进行了排序,则可以使用x < y代替x /= y

另一种方法是使用tails来避免比较同一位置的元素:

[ ... | (x:ys) <- tails xs, y <- ys]

这样做的效果是只挑选原始列表中y之后发生的项x。如果您的列表包含重复项,则需要将其与之前的显式过滤相结合。