检查两个列表中的元素是否无序相同

17
在Haskell中,如何比较两个列表以检查它们是否相等?同时顺序不应该影响结果。
例子: [1,2] = [2,1]
我尝试了all (flip elem [1,2,3]) [2,1], 但这会返回true...

1
你有检查过这个链接吗?https://dev59.com/bW025IYBdhLWcg3wQDhb - dreamcrash
1
如果顺序不重要,那么你可以将它们视为袋子,即多重集合。有一个可以完成这项工作的软件包,下面进行了解释。 - Gabriel Riba
3个回答

14

像这样的吗?

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

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

这是最有效的方式吗? - omega
@omega 我不知道。你要比较的列表是什么类型和多大? - גלעד ברקן
10
如果你关心效率,那么你可能不应该以这种方式使用列表。也许应该使用 Data.Set - Pubby
1
我认为对于这种类型的数据,它已经不能再好了。 - dreamcrash

9

10
你为什么要使用PackageImports呢?更重要的是,你为什么不提及这个而直接使用它? - Ben Millwood

4

“无序且不重复的集合”适用于 Data.Set 模块中的一个良好数据结构:

import qualified Data.Set as S

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

然而,这种方式认为[1,1][1]相等,这可能并不是您想要的。


很好的演示了Data.Set的inner属性的使用。我曾经读到过可以使用这个数据容器来完成,但是不知道如何编码,现在我明白了。谢谢你。 - zurgl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接