【发布时间】:2018-03-22 16:24:23
【问题描述】:
以下所有工作:
{-# LANGUAGE TypeFamilies #-}
type family TF a
type instance TF Int = String
type instance TF Bool = Char
data family DF a
data instance DF Int = DFInt String
data instance DF Bool = DFBool Char
type family CTF a where
CTF Int = String
CTF Bool = Char
CTF a = Double -- Overlap OK!
...但这不是(从 GHC-8.2 开始):
data family CDF a where
CDF Int = CDFInt String
CDF Bool = CDFBool Char
CDF a = CDFOther Double
wtmpf-file24527.hs:16:19: error: parse error on input ‘where’
|
16 | data family CDF a where
| ^^^^^
只是没有人费心去实现它,还是有什么特殊原因导致关闭数据系列没有意义?我有一个数据系列,我希望保持注入性,但也有机会制作一个不相交的包罗万象的实例。现在,我认为完成这项工作的唯一方法是
newtype CDF' a = CDF' (CTF a)
【问题讨论】:
-
封闭的数据族不是 GADT 吗?
-
@DavidYoung 很有趣。但我猜如果你使用 GADT,在
CDF Int中你可以找到String或Double。对于封闭的数据系列,只有String是可能的。 -
@ch 当然,这就是我的意思。
-
证据在 GADT 中以另一种方式流动,并且运行时表示完全不同。
标签: haskell type-families injective-function