这段代码可以工作,但是很冗长,我确信有更简洁的方法。
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/