список вложенных пустых списков в Haskell - PullRequest
0 голосов
/ 23 сентября 2018

Почему в Хаскеле можно составить такой список:

slist = [ [], [[]], [[],[[]]] ]

Насколько я понимаю, здесь каждый элемент имеет различные типы (например, в математике: Ø, {Ø} и т. Д.).И ghci говорит:

> :t []
[] :: [t]
> :t [[]]
[[]] :: [[t]]

формально, я вижу разные заметки.

Другими словами, первый элемент - это простой пустой список, а второй - список (!) И т. Д.

Что не так?Почему Хаскелл считает их однотипными?

Ответы [ 3 ]

0 голосов
/ 23 сентября 2018

Посмотрите на тип первого элемента такого списка:

> head [ [], [[]], [[],[[]]] ]
[]
it :: [[[t]]]

Это не t, а [[[t]]].

Почему я могу составить в Haskell такой список

Поскольку с типом этого выражения нет ничего плохого.

Чтонеправильно?Почему Хаскелл считает их одним и тем же типом?

t в [[[[t]]]] не является окончательным типом, это переменная типа.Вот почему тип первого элемента этого списка может быть a или [b] или [[c]] или [[[t]]].

0 голосов
/ 23 сентября 2018

Пустой список может быть списком любого типа.Это может быть список чисел, список строк или список списков.Я имею в виду, почему вы не можете иметь пустой список списков или даже пустой список списков списков?

Итак, в вашем списке:

--a     b       c     d
[ [], [ [] ], [ [], [ [] ] ] ]

dпустой список, c пустой список списков, b пустой список списков списков и a пустой список списков списков списков.

0 голосов
/ 23 сентября 2018

Вы правы, что в списке на Haskell все элементы должны быть одного типа.И действительно, тип в вашем примере:

> :t slist
slist :: [[[[a]]]]

Но пустой список [] может иметь любой тип, если он имеет форму [b], но существует множество возможных bs.Таким образом, есть много возможных конкретных типов.Один из них для b будет иметь тип [[[a]]], как в вашем slist.

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