Из того, что я понимаю, тип списка в Haskell реализован внутренне с использованием связанного списка. Однако пользователь языка не видит деталей реализации и не имеет возможности изменять "ссылки", составляющие связанный список, чтобы он мог указывать на другой адрес памяти. Это, я полагаю, сделано внутренне.
Как тогда, может ли тип списка быть квалифицированным как в Haskell? Является ли это "типом данных" или "абстрактным типом данных"? А что из типа связанного списка реализации?
Кроме того, поскольку тип списка, предоставляемый прелюей, не является типом связанного списка, как можно реализовать основные функции связанных списков?
Возьмем, к примеру, эту часть кода, предназначенную для добавления элемента a в индекс n списка:
add [] acc _ _ = reverse acc
add (x:xs) acc 0 a = add xs (x:a:acc) (-1) a
add (x:xs) acc n a = add xs (x:acc) (n-1) a
Используя "реальный" связанный список, добавление элемента будет состоять только в изменении указателя на адрес памяти. Это невозможно в Haskell (или это?), Поэтому вопрос: является ли моя реализация добавлением элемента в список наилучшим, или я чего-то не хватает (использование функции reverse
есть, я думаю, особенно уродливые, но можно ли обойтись без?)
Пожалуйста, не стесняйтесь корректировать меня, если что-либо, что я сказал, неправильно, и спасибо за ваше время.