我想Ord
为一个数据类型编写一个实例,Foo
它将所有比较委托给一个函数bar :: Foo -> Bar
,其中Bar
一个数据类型有一个Ord
可用的实例。
如果我手动编写此实例,它看起来像:
instance Ord Foo where
compare x y
| bar x == bar y = EQ
| bar x <= bar y = LT
| otherwise = GT
有没有更简洁的方法来写这个?
在 Scala(使用 Scalaz)中,我可以编写:
implicit val FooOrder: Order[Foo] = Order[Bar] contramap bar
Haskell有类似的东西吗?