Haskell 在单例数据类型中使用Nat/Natural的正确方法是什么?

Haskell 在单例数据类型中使用Nat/Natural的正确方法是什么?,haskell,singleton-type,Haskell,Singleton Type,我正在使用Singleton库用Haskell编写一种带有多态变体的原型编程语言。我有一个基本类型,如下所示: import Data.Singletons.TH import Data.Singletons import GHC.Natural import Data.Singletons.TypeLits $(singletons [d| data MyType = PredT | ProcT [MyType] | IntT | FloatT

我正在使用Singleton库用Haskell编写一种带有多态变体的原型编程语言。我有一个基本类型,如下所示:

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]
  |])
VariantT
中的
Natural
参数用于标识特定变量,出于效率考虑,这一点非常重要,因为它实际上是
Natural
(而不是定义为代数数据类型的Nat)

问题是,根据这个定义,我得到:

Couldn't match expected type ‘Natural’
     with actual type ‘Demote Natural’
通常,在我使用singleton库的经验中,当尝试将类型用作singleton时,我会遇到类似这样的错误(无论如何,据我所知),而该类型
SingKind
不支持该类型
e.x。对于Char
,因此我不知道为什么这不起作用


我尝试过降级Natural,
Nat
,以及不同的导入(可能我没有使用Singleton使用的正确的“Nat”或“Natural”),所有这些都给了我类似的错误。这里有什么问题?我必须为
降级a!=一个
,或者我在这里遗漏了什么?

显然这是一个尚未解决的问题。如果我理解正确,当前
singleton
TH脚本通过重用升级和降级类型相同的类型来工作,但是
Nat
完全破坏了这个模型。长期解决方案是等待GHC合并
Nat
Natural
。同时,您必须手动复制或泛化您的类型,或者滚动您自己的
Nat


作为一个短期解决方案,似乎可以扩展TH脚本
singleton
来自动执行类似的操作。对于广泛使用单身的人来说,这将是一个很好的贡献。

真可惜。我想现在我可能会推出自己的
Nat
,等到GHC 9.2才能获得内置GHC Nat/Natural的性能优势。