我正在使用单例库在 Haskell 中编写具有多态变体的原型(prototype)编程语言。我有一种基本类型,如下所示:
import Data.Singletons.TH
import Data.Singletons
import GHC.Natural
import Data.Singletons.TypeLits
$(singletons [d|
data MyType =
PredT
| ProcT [MyType]
| IntT
| FloatT
| StringT
| FuncT MyType MyType
| VariantT Natural [MyType]
| UnionT [MyType]
|])
Natural
VariantT
中的参数用于识别特定变体,重要的是它实际上是 Natural
(而不是像 Nat 那样定义为代数数据类型)出于效率原因。问题是,有了这个定义,我得到:
Couldn't match expected type ‘Natural’
with actual type ‘Demote Natural’
通常,根据我对单例库的经验,当尝试将类型用作单例时,我会遇到这样的错误(无论如何),其中 SingKind
不支持该类型 e.x. for Char
,所以我不知道为什么这不起作用。我试过
Demote Natural
, Nat
,以及不同的导入(想也许我没有使用单例使用的正确的“Nat”或“Natural”),所有这些都给了我类似的错误。这里有什么问题?我是否必须为 Demote a != a
的类型手动生成单例的定义? ,或者我在这里缺少什么?
最佳答案
显然,这仍然是一个 Unresolved 问题。如果我理解正确,目前 singletons
TH 脚本通过重用与提升和降级类型相同的类型来工作,但是 Nat
彻底打破了这个模式。长期的解决方案是等待GHC合并Nat
和 Natural
.同时,您将不得不手动复制或概括您的类型,或滚动您自己的 Nat
.
https://github.com/goldfirere/singletons/issues/478
作为短期修复,似乎可以扩展 TH 脚本 singletons
自动做类似的事情。对于广泛使用单例的人来说,这将是一个很好的贡献。
关于haskell - 在单例数据类型中使用 Nat/Natural 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65655273/