Список уровня типа одного типа-кортежа в Haskell - PullRequest
7 голосов
/ 18 февраля 2020

Используя DataKinds и TypeOperators, я могу создавать кортежи на уровне типов и списки типов на уровне типов, но не могу их вкладывать:

> :k '['(Int, Int), '(Int, Int)]
error: parse error on input ‘'’`

Я могу создать список из нескольких кортежей:

> :k ['(Int,Int),'(Int,Int)]
['(Int,Int),'(Int,Int)] :: [(*, *)]

Но это не работает только с одним кортежем:

:k ['(Int,Bool)]
<interactive>:1:2: error:
    • Expected a type, but ‘'(Int, Bool)’ has kind ‘(*, *)’

Это можно сделать с помощью KindSignatures, но это очень многословно:

> :k '[('(Int,Bool) :: (*,*))]
'[('(Int,Bool) :: (*,*))] :: [(*, *)]

Есть ли менее подробный способ сделать это, или это лучший способ?

1 Ответ

6 голосов
/ 18 февраля 2020

Вам необходимо добавить пробел:

> :k '['(Int, Int), '(Int, Int)]
<interactive>:1:1: error: parse error on input '
> :k '[ '(Int, Int), '(Int, Int)]
'[ '(Int, Int), '(Int, Int)] :: [(*, *)]

По сути, синтаксический анализатор сбит с толку буквенным символом '[', который находится в начале.

...