【发布时间】:2013-03-10 05:10:24
【问题描述】:
在 Haskell 中,如何比较两个列表以检查它们是否相等?顺序也不重要。
例子:
[1,2] = [2,1]
我试过all (flip elem [1,2,3]) [2,1],但返回的是true...
谢谢。
【问题讨论】:
-
如果顺序无关紧要,那么您将它们视为袋子,它们是多件套。有一个包可以完成这项工作,如下所述。
标签: haskell
在 Haskell 中,如何比较两个列表以检查它们是否相等?顺序也不重要。
例子:
[1,2] = [2,1]
我试过all (flip elem [1,2,3]) [2,1],但返回的是true...
谢谢。
【问题讨论】:
标签: haskell
这样的?
import Data.List (sort)
areEqual a b = sort a == sort b
OUTPUT:
*Main> areEqual [1,2] [2,1]
True
【讨论】:
Data.Set 也许?
作为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]
【讨论】:
一个很好的“无顺序无重复集合”的数据结构来自模块Data.Set:
import qualified Data.Set as S
sameElems xs ys = S.fromList xs == S.fromList ys
但是,这确实认为 [1,1] 等于 [1],这可能不是您想要的。
【讨论】: