如果使用-ddump-deriv
看看推導的輸出,你看到每一個數據族實例聲明的是生產相同的instance Typeable1 DF
。
data family DF a
data instance DF Int = DFInt deriving (Typeable)
data instance DF Char = DFChar deriving (Typeable)
給
instance Data.Typeable.Internal.Typeable1 Main.DF where
Data.Typeable.Internal.typeOf1 _
= Data.Typeable.Internal.mkTyConApp
(Data.Typeable.Internal.mkTyCon
17188516606402618172## 4748486123618388125## "main" "Main" "DF")
[]
instance Data.Typeable.Internal.Typeable1 Main.DF where
Data.Typeable.Internal.typeOf1 _
= Data.Typeable.Internal.mkTyConApp
(Data.Typeable.Internal.mkTyCon
17188516606402618172## 4748486123618388125## "main" "Main" "DF")
[]
所以這種類型的推導是不是真的做你想要它做的事情 - 這是獲得家庭爲Typeable1
不是實例。但是,然後,可能你需要自instance (Typeable1 s, Typeable a) => Typeable (s a)
內置。
data family DF a
deriving instance Typeable1 DF
data instance DF Int = DFInt deriving (Show)
data instance DF Char = DFChar deriving (Show)
data DFAll = forall a . Typeable a => DFAll (DF a)
toDFA :: Typeable a => DF a -> DFAll
toDFA = DFAll
fromDFA :: Typeable a => DFAll -> Maybe (DF a)
fromDFA (DFAll x) = cast x
和
*Main> fromDFA (toDFA DFInt) :: Maybe (DF Int)
Just DFInt
所以實例推導問題看起來像一個錯誤。關於你的答案,你究竟是爲什麼介紹存在的? –
只是爲了證明你得到了一個正在運行的'cast'。 –