Lambda表达式可以使生活更轻松,我喜欢这种方式,可以将(\x -> x + 1)
缩短为(+1)
之类的表达式。
这就是为什么我想知道对于带有两个参数并返回Ordering
的匿名函数是否存在任何相似之处。
例如:您可以缩短这段代码吗?
sortByFirst :: Ord a => [(a, b)] -> [(a, b)]
sortByFirst = sortBy (\x y -> fst x `compare` fst y)
答案 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
不是。)