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

Is there a short Lambda expression for a->a->Ordering?

Lambda 表达式可以让生活更轻松,我喜欢这种方式,您可以将 (\x -> x + 1) 等表达式缩短为 (+1)

这就是为什么我想知道是否有任何类似的匿名函数接受两个参数和 return 一个 Ordering

例如:你能缩短这段代码吗:

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

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

import Data.List

sortByFirst = sortBy (compare `on` fst)

on的定义大致是

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

Data.Ord 中的 comparing 可以拼写为...

sortByFirst = sortBy (comparing fst)

...相当于.

中的compare `on` fst

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