【发布时间】:2013-02-08 16:47:22
【问题描述】:
是否有可能在 Haskell 中让一个类型类暗示另一个类型类?例如,假设有一堆“事物”可以按“属性”排序:
data Person = Person { name :: String, age :: Int }
Person p1 <= Person p1 = (age p1) <= (age p2)
为了避免重复,可以定义一个“按键排序”类型的类
class OrdByKey o where
orderKey :: (Ord r) => o -> r
x <= y = (orderKey x) <= (orderKey y)
那么Person 的实例声明可能如下所示
instance OrdByKey Person where
orderKey Person p = age p
现在由于多种原因,这显然不起作用。我想知道这是否可能?
【问题讨论】:
-
如果您的目标只是根据记录中的特定字段进行排序,您始终可以为
Person定义Ord的实例来比较该特定字段。 -
@sabauma 是的,但我正在寻找“可以通过一些关键比较”的东西的概括。
-
对于这个特定的例子,看看comparing函数:
comparing age you me -
对于更通用的运算符然后
comparing,您可以查看on。它的类型为(b -> b -> c) -> (a -> b) -> a -> a -> c,所以是comparing age = on compare age,但您也可以在应用f后使用on (==) f来测试两件事是否相等。
标签: haskell