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

标签 haskell singleton-type

我正在使用单例库在 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合并NatNatural .同时,您将不得不手动复制或概括您的类型,或滚动您自己的 Nat .
https://github.com/goldfirere/singletons/issues/478
作为短期修复,似乎可以扩展 TH 脚本 singletons自动做类似的事情。对于广泛使用单例的人来说,这将是一个很好的贡献。

关于haskell - 在单例数据类型中使用 Nat/Natural 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65655273/

相关文章:

list - 在 Haskell 中使用 HoF 实现过滤器

scala - 获取scala中单例类型的实例

haskell - Sigma 中的限制类型

haskell - 描述给定 foldr 函数的前几个评估步骤

haskell - 如何将包添加到 cabal2nix 生成的 `env` ?

function - 如何在 Haskell 中创建 Prouhet-Thue-Morse 序列?

haskell - 用 Haskell 编码 "Less Than"

haskell - 单例参数的特化

scala - 将特征限制为对象?

java - Java 8 中 Haskell 的 foldr 等价物