sorting - 组成两个比较函数?

标签 sorting haskell

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

Haskell 中组合两个比较函数的惯用方式是什么,即与 sortBy 一起使用的函数?

给定

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

作曲 fg会产生:
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/

相关文章:

java - 如何在 WebDriver 中对 ArrayList 中的 WebElement 进行排序?

python - 对 Pandas Series 的数据进行排序,然后按字母顺序优雅地按索引排序

c++ - 为什么我的程序无法对整数字符串进行排序?

类型别名声明中的 Haskell 类型类

python - 如何找到一个键的多个值的平均值?

android - 如何在android中对日期和空日期进行排序?

haskell - 为什么我不能在 Haskell 中将 Integer 添加到 Double ?

arrays - Haskell 中惰性数组的适当表示

python - 使用 REPA 优化 haskell 中的平均图像颜色程序

haskell - 如何摆脱 ghci 堆栈中烦人的启动消息?