按元素列表的第二个元素对列表进行排序
sortBy :: (a -> a -> Ordering) -> [a] -> [a]
comparing :: (Ord b) => (a -> b) -> a -> a -> Ordering
在这种情况下,我们想通过第二个元素进行比较。你可以使用comparing snd
来获得一个函数,它可以通过元素的第二个元素比较两个元组。
如果我想定义我自己的排序功能来从任何地方打电话,那我该怎么做呢?我可能需要多次使用 – user1214840 2012-02-16 21:18:45
换句话说,我想定义自己的排序函数,它需要一排元组对它的第二个元素进行排序,然后返回同样的元组列表。 – user1214840 2012-02-16 21:26:12
@ user1214840与其他定义相同:'myFancySort = { - 使用ehird的提示在这里实现 - }' – 2012-02-16 21:28:35
另一个很酷的技巧是使用on
从Data.Function:
import Data.Function (on)
import Data.List (sortBy)
sortBy (compare `on` snd) [...]
不低于comparing
太大的不同,但是从时间一个漂亮的把戏时间。
'on'有一些不错的技巧。我偶尔会发现'equating = on(==)'是有用的。 (比较=比较) – 2012-02-16 23:19:31
考虑一个“普通”之类的
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 ...
sortBy
在Data.List中提供,如上面提到的那样。
这是一个功课题吗?如果是这样,你应该添加'家庭作业'标签。 – 2012-02-16 21:29:31