haskell - 对于字典序 Ord 实例来说,优雅的习惯用法是什么?

标签 haskell lexicographic

这段代码可以工作,但是很冗长,我确信有更简洁的方法。

import qualified Data.Vector as V

data Event a = Event { start :: Time
                     , duration :: Time
                     , payload :: Maybe a } deriving (Show, Eq)

instance Ord a => Ord (Event a) where
  (<=) a b = start a < start b
    || start a == start b && duration a < duration b
    || start a == start b && duration a == duration b && payload a <= payload b

其背后的想法是,如果一件事在另一件事之前开始,您应该将其称为较小的,甚至不看其他两个字段。同样,如果它们同时开始,但其中一个比较简短,则较短的那个较小,您可以忽略第三个字段。

最佳答案

使用派生:

data Event a = Event { start :: Time
                     , duration :: Time
                     , payload :: Maybe a } deriving (Show, Eq, Ord)

派生实例自动按字典顺序排列。

关于haskell - 对于字典序 Ord 实例来说,优雅的习惯用法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48727762/

相关文章:

haskell - 如何有效地对 Reflex.Dynamic 中的值进行分支?

haskell - 尝试用 Haskell 求 GCD。我的代码错误在哪里?

haskell - 如何在镜头样式单板库中为更高种类的类型实现孔和上下文?

haskell - 学习 Haskell 有哪些好的中级问题和项目?

C++ lexicographical_compare 有什么用?

java - 如何按字典顺序对 ArrayList 进行排序?

haskell - 这是像镜头一样的东西吗? (证明搜索变压器/组合器)

c++ - 运算符<比较多个字段

java - 查找一组数字的特定大小的所有可能组合

c# - .NET 中对以 1、10 和 2 开头的字符串进行排序并遵守数字顺序的最短方法是什么?