Список в функциональном программировании обычно определяется как рекурсивная структура данных, которая представляет собой либо специальное пустое значение, либо состоит из значения (названного «головой») и другого списка (дублированного «хвоста»).В Haskell:
-- A* = 1 + A x A*
-- there is a builtin list type:
data [a] = [] | (a : [a])
Чтобы добавить элемент в голову, вы можете использовать «cons»: функцию, которая берет голову и хвост и выдает соответствующий список.
-- (:) is "cons" in Haskell
(:) :: a -> [a] -> [a]
x = [1,2,3] -- this is short for (1:(2:(3:[])))
y = 0 : x -- y = [0,1,2,3]
Чтобы добавить элементы в конце, вам нужно свернуть список вниз, чтобы добавить его.Это можно легко сделать с помощью сгиба.
consAtEnd :: a -> [a] -> [a]
consAtEnd x = foldr [x] (:)
-- this "rebuilds" the whole list with cons,
-- but uses [x] in the place of []
-- effectively adding to the end
Чтобы добавить элементы посередине, вам нужно использовать аналогичную стратегию:
consAt :: Int -> a -> [a] -> [a]
consAt n x l = consAtEnd (take n l) ++ drop n l
-- ++ is the concatenation operator: it joins two lists
-- into one.
-- take picks the first n elements of a list
-- drop picks all but the first n elements of a list
Обратите внимание, что за исключением вставок в головеэти операции пересекают весь список, что может стать проблемой производительности.