我想按照第二个元素对元组列表进行排序。
示例输入:
[("Bob",3),("Terry",1)]
示例输出:
[("Terry",1)("Bob",3)]
答案 0 :(得分:15)
另一个很酷的技巧是使用Data.Function中的on
:
import Data.Function (on)
import Data.List (sortBy)
sortBy (compare `on` snd) [...]
与comparing
没什么不同,但不时是一个很好的伎俩。
答案 1 :(得分:13)
sortBy :: (a -> a -> Ordering) -> [a] -> [a]
comparing :: (Ord b) => (a -> b) -> a -> a -> Ordering
在这种情况下,我们想要通过第二个元素进行比较。您可以使用comparing snd
来获取可以通过第二个元素比较两个元组的函数。
答案 2 :(得分:2)
考虑“常规”排序
sort xs = ... a < b ...
此类排序必须使用compare
或其朋友,例如<
。因此,如果您已经实施了这样的事情,那么您可以改为compare a b
或a < 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 ...
Data.List中提供了 sortBy
,如第三部分所述。