xs ++ ys
добавляет некоторые издержки во все ячейки списка из xs
, но как только он достигает конца xs
, он становится свободным - он просто возвращает ys
.
Просмотр определения(++)
помогает понять, почему:
[] ++ ys = ys
(x:xs) ++ ys = x : (xs ++ ys)
, т. Е. Он должен «перестроить» весь первый список по мере прохождения результата. Эта статья очень полезна для понимания того, как рассуждать о ленивом коде таким образом.
Главное, что нужно понять, это то, что добавление не происходит сразу;новый связанный список создается постепенно, сначала пройдя через все 1015 *, а затем поместив ys
туда, куда пойдет []
.
Итак, вам не нужно беспокоиться о достижении концаb
и внезапно повлечет за собой разовую стоимость «добавления» a
к нему;стоимость распределена по всем элементам b
.
Векторы - это совершенно другое дело;они строгие по своей структуре, поэтому даже проверка только первого элемента xs V.++ ys
влечет за собой все затраты на выделение нового вектора и копирование в него xs
и ys
- как в строгом языке.То же относится и к изменяемым векторам (за исключением того, что затраты возникают при выполнении операции, а не при форсировании результирующего вектора), хотя я думаю, что вам все равно придется написать собственную операцию добавления с этими операциями.Вы можете представить набор добавленных (неизменяемых) векторов как [Vector a]
или аналогичный, если это проблема для вас, но это просто перемещает накладные расходы, когда вы сливаете их обратно в один вектор, и это звучит так, как будто вы болееинтересует изменяемые векторы.