a-> a-> Ordering是否有简短的Lambda表达式?

时间:2018-11-27 01:12:51

标签: haskell lambda anonymous-function

Lambda表达式可以使生活更轻松,我喜欢这种方式,可以将(\x -> x + 1)缩短为(+1)之类的表达式。

这就是为什么我想知道对于带有两个参数并返回Ordering的匿名函数是否存在任何相似之处。

例如:您可以缩短这段代码吗?

sortByFirst :: Ord a => [(a, b)] -> [(a, b)]
sortByFirst = sortBy (\x y -> fst x `compare` fst y)

2 个答案:

答案 0 :(得分:4)

您可以使用on模块中的Data.Function函数。

import Data.List

sortByFirst = sortBy (compare `on` fst)

on的定义大致是

on f g = \x y -> f (g x) (g y)

答案 1 :(得分:1)

使用comparing中的Data.Ord,可以将其拼写为...

sortByFirst = sortBy (comparing fst)

...等效于chepner's answer中的compare `on` fst

Data.List还提供了sortOn :: Ord b => (a -> b) -> [a] -> [a],但这是一个特殊目的的函数,只有在所涉及的a -> b函数有些昂贵时才值得使用,fst不是。)