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
不是。)
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
不是。)