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

sub*_*ray 6 comparison performance haskell functional-programming dataset

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

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

一个简化的例子:

Set = [("Bob", 10), ("Megan", 7), ("Frank", 2), ("Jane", 11)]
Run Code Online (Sandbox Code Playgroud)

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

这是我开始研究的代码示例:

run xs = [ someAlgorithm (snd x) (snd y) | x <- xs, y <- xs, x /= y ]
Run Code Online (Sandbox Code Playgroud)

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

如何解决这个问题的任何建议将不胜感激.

ham*_*mar 8

如果您对数据类型有订单,则可以使用x < y而不是x /= y.

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

[ ... | (x:ys) <- tails xs, y <- ys]
Run Code Online (Sandbox Code Playgroud)

这具有仅挑选在原始列表y中发生的项目的效果x.如果您的列表包含重复项,则需要将其与之前的显式过滤相结合.