【发布时间】:2012-03-08 07:33:06
【问题描述】:
我想按第二个元素对元组列表进行排序。
示例输入:
[("Bob",3),("Terry",1)]
示例输出:
[("Terry",1)("Bob",3)]
【问题讨论】:
-
这是一道作业题吗?如果是这样,您应该添加
homework标签。
我想按第二个元素对元组列表进行排序。
示例输入:
[("Bob",3),("Terry",1)]
示例输出:
[("Terry",1)("Bob",3)]
【问题讨论】:
homework 标签。
另一个很酷的技巧是使用来自 Data.Function 的on:
import Data.Function (on)
import Data.List (sortBy)
sortBy (compare `on` snd) [...]
与comparing 没有太大区别,但时不时会出现一个不错的技巧。
【讨论】:
on 有一些不错的技巧。我偶尔会发现equating = on (==) 很有用。 (comparing = on compare)
【讨论】:
myFancySort = {- implementation using ehird's hints here -}
考虑一个“常规”排序
sort xs = ... a < b ...
这样的排序必须使用compare,或者它的朋友,比如<。因此,如果您已经实现了这样的事情,那么您可以改为使用compare (snd a) (snd b) 或snd a < snd b 而不是compare a b 或a < b。
sort xs = ... snd a < snd b ...
当然,如果你够聪明,你会抽象出“访问器”,并将其作为排序函数的附加输入:
sortComparingOn f xs = ... f a < f b ...
您甚至可以完全抽象出比较器:
sortBy cmp xs = ... a `cmp` b ...
sortBy 在 Data.List 中提供,如 ehird 所述。
【讨论】: