我想按一个属性排序,然后按另一个属性排序(如果第一个属性相同.)
在Haskell中组成两个比较函数的惯用方法是什么,即与...一起使用的函数sortBy
?
特定
f :: Ord a => a -> a -> Ordering
g :: Ord a => a -> a -> Ordering
Run Code Online (Sandbox Code Playgroud)
撰写f
并g
会产生:
h x y = case v of
EQ -> g x y
otherwise -> v
where v = f x y
Run Code Online (Sandbox Code Playgroud)
jbe*_*man 51
维特指出的非常酷的实例Monoid
进行Ordering
.如果你将它与实例结合起来,那么instance Monoid b => Monoid (a -> b)
你的组合函数就是(准备好了):
mappend
Run Code Online (Sandbox Code Playgroud)
看看这个:
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
Run Code Online (Sandbox Code Playgroud)
+1用于强大而简单的抽象