在Haskell中,如何比较两个列表以检查它们是否相等?同时顺序不应该影响结果。
例子: [1,2] = [2,1]
我尝试了all (flip elem [1,2,3]) [2,1], 但这会返回true...
例子: [1,2] = [2,1]
我尝试了all (flip elem [1,2,3]) [2,1], 但这会返回true...
像这样的吗?
import Data.List (sort)
areEqual a b = sort a == sort b
OUTPUT:
*Main> areEqual [1,2] [2,1]
True
Data.Set
? - PubbyEq 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]
相等,这可能并不是您想要的。