2012-02-16 137 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中提供,如上面提到的那样。

相关问题