3

我想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有类似的东西吗?

4

1 回答 1

11
import Data.Ord

instance Ord Foo where
    compare = comparing bar

是我能想到的OTTOMH最简洁的版本。

稍微不那么简洁,但更好地概括是

import Data.Function

instance Ord Foo where
    compare = compare `on` bar
于 2012-11-03T23:17:31.443 回答