次のコードがあるとします。ここでは、いくつかの型が他の 2 つの型の内側に配置されており、その最も外側が GADT です。
{-# LANGUAGE FlexibleInstances,
GADTSyntax,
GADTs,
OverlappingInstances,
StandaloneDeriving #-}
data SomeType1 = SomeType1 deriving Show
data SomeType2 = SomeType2 deriving Show
class SomeClass d where
instance SomeClass SomeType1 where
instance SomeClass SomeType2 where
data WrapperType t where
WrapperType :: (SomeClass t, Show t) => t -> (WrapperType t)
instance Show (WrapperType SomeType1) where
show (WrapperType d) = "correct"
instance Show (WrapperType t) where
show (WrapperType d) = "incorrect"
data ListWrap where
ListWrap :: [(WrapperType d)] -> ListWrap
deriving instance Show ListWrap
今、書くこと[WrapperType SomeType1]
は私が欲しいものを私に与えます:
*MyModule> [WrapperType SomeType1]
[correct]
しかし、それを中に入れるとすぐに、コンテンツを表示するListWrap
ために間違ったShow
インスタンスが選択されます。
*MyModule> ListWrap [WrapperType SomeType1]
ListWrap [incorrect]
型クラスや GADT について、私が理解できていない何かがあるに違いありません。