Подтвердить что ты не робот

Составляя две функции сравнения?

Я хотел бы сортировать по одному свойству, а затем другому (если первое свойство одно и то же.)

Какой идиоматический способ в Haskell состоит в создании двух функций сравнения, т.е. функции, используемой с sortBy?

Учитывая

f :: Ord a => a -> a -> Ordering
g :: Ord a => a -> a -> Ordering

составление f и g даст:

h x y = case v of
          EQ -> g x y
          otherwise -> v
        where v = f x y
4b9b3361

Ответ 1

vitus указывает на очень классный пример Monoid для Ordering. Если вы объедините его с экземпляром instance Monoid b => Monoid (a -> b), то окажется, что ваша композиционная функция просто (готовьтесь):

mappend

Проверьте это:

Prelude Data.Monoid> let f a b = EQ
Prelude Data.Monoid> let g a b = LT
Prelude Data.Monoid> :t f `mappend` g
f `mappend` g :: t -> t1 -> Ordering
Prelude Data.Monoid> (f `mappend` g) undefined undefined 
LT
Prelude Data.Monoid> let f a b = GT
Prelude Data.Monoid> (f `mappend` g) undefined undefined 
GT

+1 для мощных и простых абстракций