При работе через Ричард Птичье Думая Функционально С Haskell, я наткнулся на демонстрацию системы типа Haskell, что я нахожу загадочное (стр 44).:автоматическое типирование вложенных списков
[ [], [[]], [[[]]] ] :: [[[[a]]]]
Чтобы объяснить, пусть основной список имеет тип
[b]
. Первым элементом является список , поэтомуb=[c]
. Второй элемент - это список списков, поэтомуc=[d]
. третий элемент является списком списков списков, такd=[a]
Не этот тип подписи указывает, что первый элемент основного списка имеет тип [[[a]]]
? Я не понимаю, как это возможно.
Я теряю вас при переходе с шага 3 до 4. Если я помещаю одно целое в эти вложенные списки (например, [[1], [[2]]], компилятор больше не принимает его. Поэтому, как они могут быть одного типа? – planarian
Компилятор больше не принимает его, потому что '[1]' и '[[2]]' can_not_ имеют один и тот же тип (например, '[Int]' vs. '[[Int]]'). OTOH, '[]' и '[[]]' могут иметь тип '[[Int]]', то есть оба списка списков: первый - это пустой список (не содержащий списков), а последний - _non-empty_ список, содержащий один список, хотя в свою очередь не содержит целых чисел (но может). – leftaroundabout
См. Также мое редактирование. – leftaroundabout