有件事我不明白。我定义了一个新类型
Q
并基于它定义了一个类型别名 QPolynomial
:
newtype Q = Q Rational
deriving Eq
type QPolynomial = MP.T Q
instance Show QPolynomial where
show x = ...
然后编译会抛出一个错误:它声称已经有一个由
Show
在 QPolynomial
库中定义的 MP
的 Show a => Show (MP.T a)
实例。但是我的新类型 Q
没有 Show
实例。那么为什么要考虑Show a => Show (MP.T a)
呢?
您最初定义的是
newtype
。但是,当您使用 type
时,正如您对 QPolynomial
所做的那样,您正在为现有类型创建同义词。 type
没有定义新类型。这就是 newtype
的用途。
所以,
QPolynomial
只是MP.T Q
的另一个名字。当您写 instance Show QPolynomial
时,它与写 instance Show (MP.T Q)
是一样的