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

Nat*_*ell 5 haskell singleton-type

我正在使用单例库在 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]
  |])
Run Code Online (Sandbox Code Playgroud)

Natural在参数VariantT被用来标识特定的变体,而对于这实际上是很重要的Natural(而不是像在NAT定义为代数数据类型)efficency原因。

问题是,有了这个定义,我得到:

Couldn't match expected type ‘Natural’
     with actual type ‘Demote Natural’
Run Code Online (Sandbox Code Playgroud)

通常,根据我对单例库的经验,当我尝试将类型用作单例SingKind而不支持该类型时,我会遇到这样的错误(无论如何我的理解)e.x. for Char,所以我不知道为什么会这样不工作。

我已经尝试过Demote Natural, Nat, 以及不同的导入(我想也许我没有使用正确的“Nat”或“Natural”,单身人士可以使用),所有这些都给了我类似的错误。这里有什么问题?我是否必须编写单例为 which 类型手动生成的定义Demote a != a,或者我在这里遗漏了什么?