2013-03-10 40 views
14

Haskell'de, eşit olup olmadığını kontrol etmek için iki listeyi nasıl karşılaştırabilirsiniz? Ayrıca sipariş önemli olmamalı.Haskell'de iki liste nasıl karşılaştırılır?

Örnek:

[1,2] = [2,1]

Ben all (flip elem [1,2,3]) [2,1] çalıştı, ancak bu true döndürür ...

teşekkürler.

+1

aramaya/6121256/etkin bir şekilde denetleme-hepsi-hepsi-the-elements-of-bir-büyük-liste- – dreamcrash

+1

Eğer sipariş önemli değilse, o zaman onlara çok katlı olan poşetler olarak davranırsınız. Aşağıda açıklanan işi yapan bir paket var. –

cevap

13

Böyle bir şey mi var?

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

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

Bu en etkili yol mu? – omega

+0

@omega Hiçbir fikrim yok. Listeler ne tür ve ne kadar büyüktür? –

+10

@omega verimliliğinize önem veriyorsanız, muhtemelen bu şekilde liste kullanmamalısınız. Data.Set belki? – Pubby

4

için iyi bir veri yapısı "koleksiyonundan sipariş veya tekrar içermeyen" modülünde Data.Set şöyledir:

import qualified Data.Set as S 

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

Ancak bu [1] eşit olacak şekilde [1,1] olarak değerlendirir, olmayabilir neyi İstediğiniz.

+0

İç'in Data.Set öğesinin kullanımının güzel illüstrasyonu. Bunun, bu veri kabı kullanılarak yapılabildiğini okudum, ancak bunu nasıl kodlayacağımı bilmiyorum, şimdi anladım. Teşekkürler. – zurgl

7

Eq a => Eq [a] (http://www.haskell.org/ghc/docs/7.4.1/html/libraries/base-4.5.0.0/Data-Eq.html) olarak, eşitlik listeleri karşılaştırmak için ekstra kod gerekir YAPMAYIN.

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

Eğer çanta gibi listeleri karşılaştırmak isterseniz

, daha sonra torbanın MultiSet, yani bu bağlantıyı http://stackoverflow.com/questions kontrol ettin bir 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] 
+7

Neden PackageImports kullanıyorsunuz? Dahası, neden bunu söylemeden bunu yapıyorsun? –

İlgili konular