Насколько я понимаю, тип списка в Haskell реализован внутри с использованием связанного списка. Однако пользователь языка не может видеть детали реализации, а также не имеет возможности изменять «ссылки», составляющие связанный список, чтобы позволить ему указывать на другой адрес памяти. Это, я полагаю, делается внутри.
Как же тогда тип списка можно квалифицировать как в Haskell? Это «тип данных» или «абстрактный тип данных»? А как насчет типа связанного списка реализации?
Кроме того, поскольку тип списка, предоставляемый Prelude, не является типом связанного списка, как можно реализовать основные функции связанного списка?
Возьмем, к примеру, этот фрагмент кода, предназначенный для добавления элемента 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
, я думаю, особенно некрасиво, но можно ли обойтись без него?)
Пожалуйста, не стесняйтесь поправлять меня, если я сказал что-то не так, и спасибо за ваше время.