【问题标题】:How to compare two lists in Haskell?如何比较 Haskell 中的两个列表?
【发布时间】:2013-03-10 05:10:24
【问题描述】:

在 Haskell 中,如何比较两个列表以检查它们是否相等?顺序也不重要。

例子:

[1,2] = [2,1]

我试过all (flip elem [1,2,3]) [2,1],但返回的是true...

谢谢。

【问题讨论】:

  • 你检查了这个链接stackoverflow.com/questions/6121256/…
  • 如果顺序无关紧要,那么您将它们视为袋子,它们是多件套。有一个包可以完成这项工作,如下所述。

标签: haskell


【解决方案1】:

这样的?

import Data.List (sort)
areEqual a b = sort a == sort b

OUTPUT:
*Main> areEqual [1,2] [2,1]
True

【讨论】:

  • 这是最有效的方法吗?
  • @omega 我不知道。您要比较的列表类型和大小?
  • @omega 如果您关心效率,那么您可能不应该以这种方式使用列表。 Data.Set 也许?
  • 我认为对于这种类型的数据它没有得到比这更好。
【解决方案2】:

作为Eq a => Eq [a] (http://www.haskell.org/ghc/docs/7.4.1/html/libraries/base-4.5.0.0/Data-Eq.html)

您不需要额外的代码来比较列表是否相等。

[1,2] == [2,1]

如果您想将列表作为包进行比较,则包是 MultiSet,因此请查找 Multiset package

import "multiset" Data.MultiSet as M

-- or

import "multiset" Data.IntMultiSet as M   -- if you deal with Ints 

M.fromList [1,2] == M.fromList [2,1] 

【讨论】:

  • 你到底为什么要使用 PackageImports?更重要的是,你为什么不提?
【解决方案3】:

一个很好的“无顺序无重复集合”的数据结构来自模块Data.Set

import qualified Data.Set as S

sameElems xs ys = S.fromList xs == S.fromList ys

但是,这确实认为 [1,1] 等于 [1],这可能不是您想要的。

【讨论】:

  • Data.Set 的 inner 属性的使用很好的说明。我读过这可以使用这个数据容器来完成,但不知道如何对其进行编码,现在我明白了。谢谢你。
猜你喜欢
  • 2016-04-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-05
相关资源
最近更新 更多