使用转换函数来创建类型类的实例

时间:2011-04-01 21:41:33

标签: haskell typeclass

让我说我有:

data MyType
myToDouble :: MyType -> Double

假设我希望MyType成为Num或Real的实例,或者是Double已经是实例的实例。

有没有一种简单的方法可以实现这一点而无需手动写出Num / Real中的所有方法呢?

所以......有什么方法可以说:

instance Real MyType by way of myToDouble

1 个答案:

答案 0 :(得分:5)

绝对不是; Real取决于NumNum的方法返回a(或者更确切地说,是a中的协变)。你将如何实施:

(+) :: MyType -> MyType -> MyType

仅提供MyTypemyToDouble

现在也许您已经拥有了所有其他实例,只是想知道Real。好吧,Real唯一的方法是它自己的toRational,所以:

instance Real MyType where
    toRational = toRational . myToDouble

至于你更普遍的问题:遗憾的是没有。如果你有一个类的方法都是逆变量(只作为参数)在类型变量中,那么你应该能够在这样的投影上自动定义一个类型类。但是Haskell没有这样做的机制。 (您可以使用Template Haskell自己编写一个)。

可以使用GeneralizedNewtypeDeriving将新类型的实例“转发”到其基础类型。例如

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

newtype MyType = MyType Double
    deriving (Eq,Ord,Show,Num,Real)

但是你不能使用任何旧的同构。真是太遗憾了。