Короткий ответ: Может быть, в некотором смысле, но на самом деле не ...
Longer Ответ:
Когда вы говорите, связанный список, который вы соберетесь в императивных условиях. Haskell ленив и функциональен, что затрудняет ответ на этот вопрос.
[a,b,c]
- короткая рука для a:(b:(c:[]))
. Если мы полностью оценим это (например, попробуем распечатать его), то, что заканчивается в памяти, выглядит и действует очень похоже на связанный список на C, но с гораздо большим количеством мозгов. Но обычно это не то, что происходит со списком в функциональной настройке. Способ работы большинства списков основан на выполнении чего-либо с заголовком списка и отправке хвоста списка из другого места (возможно, в одно и то же место). Это означает, что список действительно выглядит как x:xs
, где xs
- это просто функция, которая создаст остальную часть списка. (a thunk в терминологии GHC)
Весь список не создан, а затем обрабатывается так, как вы бы сделали на императивном языке. Это поток через fromList
функция одна часть за раз.
По крайней мере, это самый способ работы fromList
. Общий fromList
для коллекции может выглядеть следующим образом:
fromList :: [a] -> Collection a
fromList = Data.List.foldl' insert empty
Некоторые коллекции могут воспользоваться имеющие более одного элемента добавляется в то время. Эти коллекции (и я не знаю никого, но я знаю, что они существуют) создадут более обширный список в памяти.
Вне оптимизации компилятора, однако, как правило, бывает, что
вычислительно эквивалент (в пределах крошечного постоянного множителя) от:
empty `insert` 1 `insert` 2 `insert` foo
Отказ от ответственности: я не хорошо знакомы с внутренностями любых реализаций Haskell, чтобы с абсолютной уверенностью сказать, как они оценивают константу списка в коде, но это не слишком далеко от реальности. Я жду просветления от гуру GHC
, если я ухожу от базы.
Возможно, вы захотите уточнить, запрашиваете ли вы это для «Вектор» или в целом для любого типа. «Вектор» - это особый случай, потому что у него, вероятно, есть специальные правила перезаписи Vector, чтобы вывести промежуточные списки. –
@GabrielGonzalez thanks, я отредактировал, чтобы уточнить, что мне интересно, если специальная обработка происходит для любой коллекции с помощью 'fromList', хотя если только * some * исключает список (возможно,« Vector », например), это также хорошо для знаю –
Боюсь, вам, как правило, придется предположить, что _will_ будет фактическим списком, если вышеупомянутые специализированные 'Vector'-оптимизации или аналогичные удары не будут. – leftaroundabout