Что делает Data.Semigroup ((<>)) в этом Haskell коде сортировки? - PullRequest
5 голосов
/ 06 апреля 2020

Программа может сортировать список по Mfg или по году. Что такое (<>)?

import Data.Semigroup ((<>))

compare = comparing year <> comparing mfg
.
.
.

1 Ответ

5 голосов
/ 06 апреля 2020

import Data.Semigroup ((<>)) не делает ничего полезного в вашей программе, и с тех пор не был выпущен GH C 7.10 в 2015 году. До этого он включил оператор <> в область действия, чтобы compare = flip (comparing year) <> comparing mfg мог использовать Это. В GH C 7.10 этот оператор был добавлен в Prelude, поэтому теперь он всегда находится в области действия, даже не импортируя его.

Что касается того, что <> делает, вы используете его в типе Vehicle -> Vehicle -> Ordering. Это происходит от экземпляра Semigroup b => Semigroup (a -> b) (дважды) и экземпляра Semigroup Ordering. Эффект net заключается в том, что после применения к нему обоих Vehicles он будет использовать результат сравнения с левой стороны (flip (comparing year)), если только это не EQ, в этом случае он будет использовать правое -обратное сравнение (comparing mfg) вместо них. Если бы вы написали от руки именно то, что делали, это было бы так:

compare x y = case flip (comparing year) x y of
  LT -> LT
  EQ -> comparing mfg x y
  GT -> GT
...