あなたが報告している正確なエラー メッセージを再現することはできませんが、あなたの例には 2 つの問題があります。
型コンストラクターを介してパラメーター化されたものを派生させようとして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)