2010-05-07 28 views
9

它如何以最簡單的方式寫入(或者可能有嵌入在haskell中的某些東西)函數,該函數將元組(String,Int)和Int x作爲參數列表並根據列表返回頂部x元組以x值。haskell排序

我不知道是否有可能編寫一個函數,該函數還需要3個參數,這個參數是根據哪個排序必須完成的元組中的字段名稱(或索引)。

什麼是最好的解決方案,使其非常通用?

+0

我知道你的問題可能更多是爲了你自己的好奇心,但你對數據做了什麼?排序列表是否真的是你想要的結果?我們不再在C國家的低級數組中對元素進行洗牌,而haskell可以讓您輕鬆訪問整個有趣數據類型的動物園,這些數據類型可能更適合做任何您將要對「排序」數據。 – jberryman 2010-05-07 18:49:07

+0

原因是我在學習,想知道什麼是可能性,並且排序功能是每個人都理解的,所以消除更容易。當然,我知道嵌入式類型,仍然在學習,謝謝 – gruber 2010-05-08 22:05:05

回答

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

take x從排序列表中獲取前x項。 sortBy使用作爲第一個參數給出的排序函數,將給出的列表排序爲第二個參數。 (compare `on` fst)比較每個元組的第一個值。 請注意,此示例比較每個元組的排序的第一個值。要按第二個值排序,請用snd替換fst

您會發現sortBy函數非常通用,因爲它允許您定義用於比較值的函數。該函數有兩個參數,應該返回LT,EQ或GT之一。請注意,函數compare需要兩個參數來自Ord。幫助功能on可以在模塊Data.Function中找到。功能sortBy位於模塊Data.List中。

編輯: 這是一個完整的工作示例,它通過比較它們的第一個值並打印結果列表的前2個元組來排序元組列表。請注意,我將上面的示例中的on替換爲顯示內部值on的等效函數。

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 

編輯: 當湯姆Lokhorst在他的評論中指出,從模塊Data.Ord功能comparingon compare一個更可讀的替換/快捷方式,所以上面還可以寫成sortBy (comparing fst)

+8

請注意,'Data.Ord'中的'比較'函數與'on compare'相同。所以你也可以寫'sortBy(比較fst)list'。 – 2010-05-07 13:14:27

+0

不錯,我不知道那個。 – jkramer 2010-05-07 14:02:31

+0

你應該在'sortBy'之前不要'拿'嗎? mySort可能會採取無限列表。 – 2014-04-10 17:49:34