2010-05-07 17 views
9

Yazma yöntemine göre en basit şekilde nasıl yazılır (veya haskell'de gömülü bir şey var) işlevi, değişkenler listesi olarak dize (String, Int) ve Int x ve return x toplar listesi x değerine.haskell sorting

Ayrıca, hangi sıralama işleminin yapılması gerektiğine bağlı olarak, tuple dosyasında (veya indeks) adı verilen 3 argümanı da alan bir fonksiyon yazmanın mümkün olup olmadığını merak ediyorum.

Bunu oldukça genel yapmak için en iyi çözümler nelerdir?

+0

Sorunun muhtemelen kendi merakınız için daha fazla olduğunu biliyorum, ancak verilerle ne yapıyorsunuz? Sıralanmış bir liste gerçekten ne yapmak istersin? Artık C ülkesindeki düşük seviyeli dizilerde öğeleri karıştırmıyoruz ve haskell, muhtemelen "sıralanmış" ile yapacağınız her şeyi yapmak için daha uygun olan ilginç veri türlerinin tüm hayvanat bahçesine kolay erişim sağlıyor veri. – jberryman

+0

Bunun sebebi, öğrenmenin ve olasılıkların ne olduğunu bilmek istemesi ve sıralama işlevinin herkesin anlayabilmesi ve bu nedenle de açıklamanın daha kolay olması. Tabii ki gömülü tipler hakkında biliyorum, hala öğreniyorum, teşekkürler – gruber

cevap

22
take x $ sortBy (compare `on` fst) [("asd", 1), ...] 

take x sıralı listeden birinci x öğeleri alır. sortBy, birinci bağımsız değişken olarak verilen sıralama işlevini kullanarak ikinci bağımsız değişken olarak verilen listeyi sıralar. (compare `on` fst), her bir tuple'nın ilk değerlerini karşılaştırır. Bu örnekte, sıralama için her bir tuple'ın ilk değerini karşılaştırdığına dikkat edin. İkinci değere göre sıralamak için fst'u snd ile değiştirin.

Değerleri karşılaştırmak için kullanılan işlevi tanımlamanıza olanak tanıdığından, sortBy işlevinin çok genel olduğunu görürsünüz. Fonksiyon iki argüman alır ve LT, EQ veya GT'den birini döndürmelidir. compare işlevinin, Ord'dan türetilmesi için her iki argümanın gerektiğini unutmayın. Yardımcı işlev on, Data.Function modülünde bulunabilir. sortBy işlevi, Data.List modülünde bulunur.

DÜZENLEME: Burada, ilk değerlerini karşılaştırarak ve sonuç listesinin ilk 2 kopyasını yazdırarak, bir tupl listesini sıralayan tam bir çalışma örneği. Yukarıdaki örnekten, on'un dahili olarak ne yaptığını gösteren eşdeğer bir işlevle değiştirdiğimi unutmayın.

import Data.Function 
import Data.List 

main = print $ mySort [("foo", 1), ("bar", 2), ("baz", 3), ("quux", 4)] 2 

mySort list x = take x $ sortBy (\ x y -> compare (fst x) (fst y)) list 

DÜZENLEME: Tom Lokhorst olarak onun yorumunda işaret, modül Data.Ord gelen fonksiyon comparingon compare için daha okunabilir yedek/kısayol, bu yüzden yukarıdaki ayrıca sortBy (comparing fst) olarak yazılmış olabilir.

+8

"Karşılaştırma" işlevi "Data.Ord" öğesinden "karşılaştır" ile aynıdır. Böylece "sortBy (listeyi karşılaştırarak") yazabilirsiniz. –

+0

Güzel, bunu bilmiyordum. – jkramer

+0

"sortBy" önce "al" yapmamalısınız? mySort potansiyel olarak sonsuz bir liste alabilir. –