非也; 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)
但是你不能使用任何舊的同構。這是一個恥辱。