非也; Real
取决于Num
和Num
有方法返回a
(或更准确地说,是在a
covariant)。你将如何实现:
(+) :: 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)
但是你不能使用任何旧的同构。这是一个耻辱。