2012-12-20 65 views
1

我有一個元組列表([[(Int, Custom)]]),我想通過比較整數與外部列表進行排序。它的行爲應該像一個普通的二維排序,即它應該按照第一個列表項目排序,然後是第二個項目排序 - 但是比較第一部分而不是整個元組。在Haskell中對謂詞上的二維列表進行排序

對於一維列表,我會用sortBy (comparing fst),但我完全失去了將它們包裹在另一個列表中。我知道它會自動工作,如果我將Custom作爲Ord的實例,那麼排序會自動進行,但它不是真正可訂購的。

如果你想有一個例子和預期的結果,請發表評論。提前致謝!

回答

3

呃,問這個問題後馬上打我像一個行程:

comparing需要返回一個訂購的結果,而不是訂購或排序部分列表[(Int, Custom)](這是unorderable)的函數:

comparing :: Ord a => (b -> a) -> b -> b -> Ordering 
comparing = on compare 

所以我不得不返回的是可訂購整數的列表,即只是map fst。總共:

sortBy (compare `on` map fst) 
    :: Ord a => [[(a, b)]] -> [[(a, b)]] 
+0

這就是爲什麼'on'函數存在!方便,是吧? –