经过一年多的精神争吵,我终于明白了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进行比较。
非常感谢任何有关如何解决此问题的建议。
答案 0 :(得分:8)
如果您对数据类型进行了排序,则可以使用x < y
代替x /= y
。
另一种方法是使用tails
来避免比较同一位置的元素:
[ ... | (x:ys) <- tails xs, y <- ys]
这样做的效果是只挑选原始列表中y
之后发生的项x
。如果您的列表包含重复项,则需要将其与之前的显式过滤相结合。