组成两个比较函数?

Eri*_*ikR 34 sorting haskell

我想按一个属性排序,然后按另一个属性排序(如果第一个属性相同.)

在Haskell中组成两个比较函数的惯用方法是什么,即与...一起使用的函数sortBy

特定

f :: Ord a => a -> a -> Ordering
g :: Ord a => a -> a -> Ordering
Run Code Online (Sandbox Code Playgroud)

撰写fg会产生:

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用于强大而简单的抽象

  • 哇......太棒了. (4认同)