Почему GHCi не может разрешить вид [[]]? - PullRequest
6 голосов
/ 08 июня 2010

Почему Haskell не может разрешить вид [[]] (список списков)?
Почему это не просто * -> *, поскольку я могу дать ему тип, такой как Int, и получить [[Int]], который имеет вид *.

Ответы [ 2 ]

8 голосов
/ 08 июня 2010

Я думаю, что это то же самое, что и с Maybe Maybe, хотя в последнем случае причина, возможно, более ясна: «внешний» конструктор типа ожидает передачи типа *, но видит конструктор типа типа * -> * («внутренний» Maybe / []) и жалуется. Если я прав, это не проблема функциональности :kind GHCi, а скорее поиск правильного синтаксиса для выражения композиции конструкторов с более высоким родом.

Как обходной путь, что-то вроде

:kind forall a. [[a]]
:kind forall a. Maybe (Maybe a)
Можно использовать

(с соответствующим расширением языка - ExistentialQuantification, я думаю - для включения синтаксиса forall).

4 голосов
/ 13 августа 2010

Если мы десагар [[]] как [] [], то очевидно, что он плохо связан, потому что [] :: * -> *.

Если вы на самом деле хотели получить «список списков», вам нужно составить два конструктора типа:вид * -> *.Вы не можете сделать это без небольшого шаблона, потому что в Haskell нет лямбды на уровне типа.Вы можете сделать это, однако:

newtype Comp f g a = Comp { unComp :: f (g a) }

Теперь вы можете написать:

type ListList = Comp [] []

И написать функции, используя это:

f :: ListList Int -> ListList Int
f = Comp . map (map (+1)) . unComp

Композиция функтора, подобная этой, имеет приложенияв нескольких областях, в частности, "Типы данных a la carte" Свиерстры

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...