Haskell 可以为其类型提供文本的构造函数的数据类型提升

Haskell 可以为其类型提供文本的构造函数的数据类型提升,haskell,ghci,type-level-computation,Haskell,Ghci,Type Level Computation,我有一个简单的数据类型 data Label = LabelK String 宣布: 类型标签类型 类型为String->Label 我认为会被提升为: 一种标签 所有{l::Symbol}的类型构造函数'LabelK。标签l 然而,情况似乎并非如此,我得到了相反的结果 :kind 'LabelK :: String -> Label 因此,升级的'LabelK是一个函数(?)以字符串作为输入,并给出一种类型的'Label。恐怕哈斯克尔做不到 我们可以与你核实 data

我有一个简单的数据类型

data Label  = LabelK String 
宣布:

  • 类型
    标签
    类型
  • 类型为
    String->Label
我认为会被提升为:

  • 一种
    标签
  • 所有{l::Symbol}的类型构造函数
    'LabelK
    。标签l
然而,情况似乎并非如此,我得到了相反的结果

:kind 'LabelK :: String -> Label 
因此,升级的
'LabelK
是一个函数(?)以
字符串作为输入,并给出一种类型的
'Label
。恐怕哈斯克尔做不到

我们可以与你核实

data Proxy (i :: k) where  
  ProxyK :: Proxy i      
如果我们想在类型
'LabelK“titi”

“titi”
作为的一部分被提升为
符号,我们有一个类型错误


因此,是将命名类型参数化为类型级字符串(也称为
符号)的唯一方法,以便自己编写,如文档中所示:

data Labl (l :: Symbol) = 
   Get 
Get
类似于
ProxyK
并为我们提供类型为
Labl的值

:t Get :: forall {l :: Symbol}. Labl l 
然后

消除了在类型索引
LabelK“titi”
上构建代理的需要,这是我们无法做到的


注:在ghci中,可以使用

:set -fprint-explicit-kinds
:set -fprint-explicit-foralls
(但由于某种原因,我们无法编写
v6=Get::forall{l::Symbol}.Labl

Get :: Labl "x"
:set -fprint-explicit-kinds
:set -fprint-explicit-foralls