haskell - 可以为类型提供文字的构造函数的数据类型提升
问题描述
我有一个简单的数据类型
data Label = LabelK String
声明:
- 一种
Label
类型Type
LabelK
类型的数据构造函数String -> Label
我想象的类型会提升为:
- 一种
'Label
'LabelK
一种类型的构造函数forall {l :: Symbol}. Label l
但是,情况似乎并非如此,而是我得到了
:kind 'LabelK :: String -> Label
因此,promotion'LabelK
是一个函数(?),它以 aString
作为输入并给出一种类型'Label
。恐怕 Haskell 做不到。
我们可以验证
data Proxy (i :: k) where
ProxyK :: Proxy i
如果我们想在 type 上建立一个见证'LabelK "titi"
v3 = ProxyK :: Proxy ('LabelK "titi") -- fails
"titi"
被提升为 a Symbol
,作为提升 Literals的一部分,我们有一个类型错误。
那么,只有在文档中使用类型级字符串(又名 a Symbol
)来参数化命名类型来自己编写它吗?:
data Labl (l :: Symbol) =
Get
Get
类似于ProxyK
并给我们一个类型的值Labl l
:t Get :: forall {l :: Symbol}. Labl l
然后
Get :: Labl "x"
消除了在类型索引处构建代理的需要,LabelK "titi"
这是我们无法做到的
PS:在ghci
,一个可以使用
:set -fprint-explicit-kinds
:set -fprint-explicit-foralls
v6 = Get :: forall {l :: Symbol}. Labl l
(但由于某种原因我们不能写?)
解决方案
推荐阅读
- c# - Webclient 在 .NET Core/5 中失败,但在 .NET 框架中失败
- typescript - 自定义类型不可分配给字符串索引类型
- python - 保存和加载使用自定义模型作为层的 tf.keras 模型
- javascript - 权限禁用向 app.js 中的 customRoutes 添加路由的选项
- linux - LINUX SHELL SCRIPT 分配随机字符串作为密码
- node.js - 创建服务器并使用 nodemon 但它显示错误
- r - 加速 Rcpp `anyNA` 等效
- javascript - 如何将变量从 html 脚本提取到 JavaScript 文件?
- amazon-web-services - Uppy - 你如何通过多部分上传到 s3?使用伴侣?
- javascript - 为什么在使用 console.log() 时我的对象会同时得到两个不同的值?