Что такое "[] и": в Хаскеле?
Я видел это '[]
а также ':
синтаксис в нескольких местах, особенно в гетерогенных списках пакетов, таких как HList или HVect.
Например, гетерогенный вектор HVect
определяется как
data HVect (ts :: [*]) where
HNil :: HVect '[]
(:&:) :: !t -> !(HVect ts) -> HVect (t ': ts)
В GHCi, с расширением TemplateHaskell
или же DataKinds
Я понял
> :t '[]
'[] :: template-haskell-2.13.0.0:Language.Haskell.TH.Syntax.Name
> :t '(:)
'(:) :: template-haskell-2.13.0.0:Language.Haskell.TH.Syntax.Name
У меня сложилось впечатление, что это связано с зависимыми типами и видами и т. Д., А не с шаблоном haskell.
Поисковые системы, hoogle и hayoo обрабатывают запросы с '[]
или же ':
довольно плохо, поэтому возникает вопрос: как называются эти '[]
а также ':
вещи? Указатели на документацию или учебники будут приветствоваться.
2 ответа
DataKinds
позволяет использовать конструкторы уровня термина на уровне типа.
После
data T = A | B | C
можно писать типы, проиндексированные по значению T
data U (t :: T) = ...
foo :: U A -> U B -> ...
Здесь, однако, A
а также B
используются как типы, а не как значения. Следовательно, они должны быть "продвинуты", используя цитату:
data U (t :: T) = ...
foo :: U 'A -> U 'B -> ...
То же самое происходит со знакомым синтаксисом списка. '[]
пустой список, продвигаемый на уровне типа. '[a,b,c]
такой же как a ': b ': c ': '[]
, список повышен на уровне типа.
type :: kind
'[] :: [k] -- polykinded! works for any kind k
'[ 'A, 'B, 'C] :: [T] -- mind the spaces, we do not want the char '['
'A ': '[] :: [T]
'[ Int, Bool ] :: [*] -- a list of types
'[ Int ] :: [*] -- a list of types with only one element
[Int] :: * -- a type "list of Int"
Обратите внимание на два последних случая, когда цитата устраняет неоднозначность синтаксиса.
Книга
Мышление с типами Сэнди Магуайр ( http://thinkingwithtypes.com/)
может быть хорошим ресурсом по теме программирования на уровне типов в Haskell в целом. Глава "Снятие ограничений" посвящена DataKinds
и продвигаемые конструкторы.
(Отказ от ответственности: нет принадлежности.)