Раскрутка типов данных для конструкторов, чей тип может быть передан литералам - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть простой тип данных

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 почему-то?)

...