问题描述
我正在使用 singletons
和 singletons-th
库,并且我想(如果可能)在文件之间拆分单例定义。我尝试创建数据系列,但出现 Declaration cannot be promoted
错误。
data family Field
data family SField :: Field -> Type
singletons
[d|
data instance Field = Field1 | Field2
|]
>>> Other file:
singletons
[d|
data instance Field = Field3
|]
如何在两个或多个文件之间拆分单例定义?
解决方法
您遇到了两个问题,其中一个与文件拆分和 TH 无关。
-
“目前无法提升数据族实例构造函数。GHC 的类型理论无法胜任数据族的提升任务,需要完全依赖类型。” says the User Guide 我认为这解释了
cannot be promoted
错误。所以你不能这样定义SField
。 -
data family
应该有一个类型参数(与类相同)。类似data family Field a; ... data instance Field Int = ...; data instance Field Char = ...;
的东西。如果没有参数,您只能定义一个实例,并且它的所有构造函数都必须在该实例中。
为什么要尝试定义 data family
,为什么要通过 TH/这里的用例是什么?