我想先按一个属性排序,然后再按另一个(如果第一个属性相同。)
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
最佳答案
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 用于强大而简单的抽象
关于sorting - 组成两个比较函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11486436/