У меня есть простой тип данных
data Label = LabelK String
, объявляющий:
- тип
Label
вида Type
- конструктор данных
LabelK
типа String -> Label
, который я представлял себе, будет повышен до типа:
- вид
'Label
- конструктор типа
'LabelK
вида forall {l :: Symbol}. Label l
Однако, похоже, это не так, и вместо этого я получаю
:kind 'LabelK :: String -> Label
Так что повышение 'LabelK
является функцией (?)принимая String
в качестве входных данных и давая тип вида 'Label
.Боюсь, что Хаскелл не сможет этого сделать.
Мы можем проверить с помощью
data Proxy (i :: k) where
ProxyK :: Proxy i
, хотим ли мы создать свидетеля типа 'LabelK "titi"
v3 = ProxyK :: Proxy ('LabelK "titi") -- fails
"titi"
повышается до Symbol
, как часть продвижения литералов , и у нас есть ошибка типа.
Итак, - это единственный способ иметь именованный тип, параметризованный строкой уровня типа, или 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
почему-то?)