список вложенных пустых списков в Haskell
Почему в Haskell можно сделать такой список:
slist = [ [], [[]], [[],[[]]] ]
Насколько я понимаю, каждый элемент имеет различные типы (например, в математике: Ø, {Ø} и т.д.). И ghci говорит:
> :t []
[] :: [t]
> :t [[]]
[[]] :: [[t]]
Формально я вижу разные заметки.
Другими словами, первый элемент представляет собой простой пустой список, а второй - список списка (!) И т.д.
Что случилось? Почему Haskell считает их одинаковыми?
Ответы
Ответ 1
Вы правы, что в списке Haskell все элементы должны быть одного типа. И действительно, тип в вашем примере:
> :t slist
slist :: [[[[a]]]]
Но пустой список []
может иметь любой тип, если он имеет форму [b]
, но есть много возможных b
s. Таким образом, существует много возможных конкретных типов. Один из них - для b
типа [[[a]]]
, как в вашем slist
.
Ответ 2
Взгляните на тип первого элемента такого списка:
> head [ [], [[]], [[],[[]]] ]
[]
it :: [[[t]]]
Это не t
, но это [[[t]]]
.
Почему я могу сделать в Haskell такой список
Потому что нет ничего плохого в типе этого выражения.
Что случилось? Почему Haskell считает их одинаковыми?
t
в [[[[t]]]]
не является окончательным типом, он вводит переменную. Поэтому тип первого элемента этого списка может быть a
или [b]
или [[c]]
или [[[t]]]
.
Ответ 3
Пустым списком может быть список любого типа. Это может быть список чисел, список строк или список списков. Я имею в виду, почему бы вам не разрешить иметь пустой список списков или даже пустой список списков списков?
Итак, в вашем списке:
--a b c d
[ [], [ [] ], [ [], [ [] ] ] ]
d
- пустой список, c
- пустой список списков, b
- пустой список списков списков, a
- пустой список списков списков.