Есть ли короткое лямбда-выражение для a-> a-> Ordering? - PullRequest
0 голосов
/ 27 ноября 2018

Лямбда-выражения могут облегчить жизнь, и мне нравится, как вы можете сокращать выражения вроде (\x -> x + 1) до (+1).

. Поэтому мне интересно, есть ли что-нибудь подобное для анонимных функций, которые принимаютдва аргумента и возвращают Ordering.

Например: Можете ли вы сократить этот код:

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

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

С comparing из Data.Ord это может быть записано как ...

sortByFirst = sortBy (comparing fst)

... что эквивалентно эквиваленту compare `on` fst в ответе Чепнера .

(Data.List также предлагает sortOn :: Ord b => (a -> b) -> [a] -> [a], но это специальная функция, которую стоит использовать только в том случае, если задействованная функция a -> b стоит несколько дороже, чем fst..)

0 голосов
/ 27 ноября 2018

Вы можете использовать функцию on из модуля Data.Function.

import Data.List

sortByFirst = sortBy (compare `on` fst)

Определение on примерно равно

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