让我说我有:
data MyType
myToDouble :: MyType -> Double
假设我希望MyType成为Num或Real的实例,或者是Double已经是实例的实例。
有没有一种简单的方法可以实现这一点而无需手动写出Num / Real中的所有方法呢?
所以......有什么方法可以说:
instance Real MyType by way of myToDouble
答案 0 :(得分:5)
绝对不是; Real
取决于Num
,Num
的方法返回a
(或者更确切地说,是a
中的协变)。你将如何实施:
(+) :: MyType -> MyType -> MyType
仅提供MyType
和myToDouble
?
现在也许您已经拥有了所有其他实例,只是想知道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)
但是你不能使用任何旧的同构。真是太遗憾了。