我无法重现您报告的确切错误消息,但我可以看到您的示例存在两个问题。
您正在尝试通过类型构造函数对其进行参数化Show
。Rec
目前这对于 GHC 来说很难完全自动完成,但是您可以通过启用一些扩展来使其在实践中工作。
您正在使用部分应用的类型同义词Pt2
并Pt3
作为 的参数Rec
,这是不允许的。您可以通过切换到数据类型来解决此问题。
更详细一点:要解决问题 1,您可以说:
{-# LANGUAGE StandaloneDeriving, FlexibleContexts, UndecidableInstances #-}
data Rec t = Rec { intPt :: t Int, doublePt :: t Double }
deriving instance (Show (t Int), Show (t Double)) => Show (Rec t)
通过使用独立的派生子句,您可以明确指定Show
实例的先决条件。在这种情况下,这些前提条件还需要启用FlexibleContexts
和UndecidableInstances
扩展。
要解决问题 2,您可以执行以下操作:
data Pt2 a = Pt2 a a deriving Show
data Pt3 a = Pt3 a a a deriving Show
type Rec2 = Rec Pt2
type Rec3 = Rec Pt3
可以部分应用数据类型,但不能应用类型同义词。因此,仅当是数据类型时才允许将Pt2
其用作参数。通过这些修改,您的主要功能类型检查(和工作):Rec
Pt2
main = do
print $ Rec (Pt2 1 2) (Pt2 3.4 5.6)
print $ Rec (Pt3 1 2 3) (Pt3 5.6 7.8 9.0)