2012-02-16 133 views

回答

13

您可以使用sortBycomparing

sortBy :: (a -> a -> Ordering) -> [a] -> [a] 
comparing :: (Ord b) => (a -> b) -> a -> a -> Ordering 

在這種情況下,我們想通過第二個元素進行比較。你可以使用comparing snd來獲得一個函數,它可以通過元素的第二個元素比較兩個元組。

+0

如果我想定義我自己的排序功能來從任何地方打電話,那我該怎麼做呢?我可能需要多次使用 – user1214840 2012-02-16 21:18:45

+0

換句話說,我想定義自己的排序函數,它需要一排元組對它的第二個元素進行排序,然後返回同樣的元組列表。 – user1214840 2012-02-16 21:26:12

+2

@ user1214840與其他定義相同:'myFancySort = { - 使用ehird的提示在這裏實現 - }' – 2012-02-16 21:28:35

15

另一個很酷的技巧是使用on從Data.Function:

import Data.Function (on) 
import Data.List (sortBy) 

sortBy (compare `on` snd) [...] 

不低於comparing太大的不同,但是從時間一個漂亮的把戲時間。

+4

'on'有一些不錯的技巧。我偶爾會發現'equating = on(==)'是有用的。 (比較=比較) – 2012-02-16 23:19:31

2

考慮一個「普通」之類的

sort xs = ... a < b ... 

這樣的各種必須的compare使用,或它的朋友,如<。所以,如果你已經實現了這樣的事情,那麼,而不是隻是compare a ba < b,而不是compare (snd a) (snd b)snd a < snd b

sort xs = ... snd a < snd b ... 

當然,如果你聰明,你會抽象出來的「訪問」,並使它成爲一個額外的輸入排序功能:

sortComparingOn f xs = ... f a < f b ... 

你甚至可以抽象出比較乾脆:

sortBy cmp xs = ... a `cmp` b ... 

sortBy在Data.List中提供,如上面提到的那樣。

相關問題