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

标签 performance haskell functional-programming dataset comparison

经过一年多的心理争论,我终于对 Haskell 有了足够的了解,可以将它视为满足我大部分一般编程需求的主要语言。我非常喜欢它。

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

一个简化的例子:

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

我想将这些条目相互比较。对于像 C 或 Python 这样的语言,我可能会创建一些复杂的循环,但我不确定哪种方法(映射、折叠、列表理解?)对于函数式语言来说是最好的或最有效的。

这是我开始处理的代码示例:
run xs = [ someAlgorithm (snd x) (snd y) | x <- xs, y <- xs, x /= y ]

谓词阻止列表推导式将条目与其自身进行比较,但该函数效率不高,因为它比较了已经比较过的条目。例如。它会将 Bob 与 Megan 进行比较,然后将 Megan 与 Bob 进行比较。

任何有关如何解决此问题的建议将不胜感激。

最佳答案

如果你对你的数据类型有一个排序,你可以使用 x < y而不是 x /= y .

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

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

这具有只拣货的效果y发生在 x 之后在原始列表中。如果您的列表包含重复项,您需要将其与之前的显式过滤相结合。

关于performance - 使用 Haskell 在功能上将数据集相互比较一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13365503/

相关文章:

ruby-on-rails - 我的 Rails 应用程序中的 Postgres 性能问题

ruby - 如何改进 Netbeans 的 ruby​​ 慢性能?

5.7 版与 5.6 版的 MySQL 性能

haskell - 使用堆栈设置安装 ghc 时权限被拒绝

r - 将简单的递归关系转换为函数式程序

c++ - 为什么 gcc 生成一个 memmove 而不是 memcpy 来复制 std::vector<>?

algorithm - 使用 Haskell 计算质因数

sockets - 为什么windows需要withSocketsDo?

javascript - 链接过滤和映射方法时如何获取过滤索引

c# - 委托(delegate)的组成(功能陷阱)