2014-09-21 2 views
17

По существу мне любопытно, если такой код:Создает ли структуру данных (без списка) через список из списка?

let myCollection = Data.SomeCollection.fromList [1, 2, foo] 

на самом деле делает то, что он выглядит как во время выполнения, а также создание связанного списка в качестве промежуточного шага в создании SomeCollection -или, если это просто синтаксическое удобство, а компилятор избегает создания списка в скомпилированном коде?

Извинения, если это глупый вопрос, но я имел в виду выяснить с тех пор, как изучил Хаскелл.

+1

Возможно, вы захотите уточнить, запрашиваете ли вы это для «Вектор» или в целом для любого типа. «Вектор» - это особый случай, потому что у него, вероятно, есть специальные правила перезаписи Vector, чтобы вывести промежуточные списки. –

+0

@GabrielGonzalez thanks, я отредактировал, чтобы уточнить, что мне интересно, если специальная обработка происходит для любой коллекции с помощью 'fromList', хотя если только * some * исключает список (возможно,« Vector », например), это также хорошо для знаю –

+1

Боюсь, вам, как правило, придется предположить, что _will_ будет фактическим списком, если вышеупомянутые специализированные 'Vector'-оптимизации или аналогичные удары не будут. – leftaroundabout

ответ

12

Короткий ответ: Может быть, в некотором смысле, но на самом деле не ...

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, если я ухожу от базы.

+0

А, ты совершенно прав, я не думал о «лень». Это имеет смысл и, вероятно, делает многое для смягчения любой неэффективности, предполагая, что цепочка 'insert' не вызывает кучу перераспределения + копирование (если какие-либо коллекции используют базовые массивы, я имею в виду, хотя я думаю, что деревья больше общий подход Haskell?) –

+0

Что вы подразумеваете под «Когда вы говорите, что связанный список вы думаете в императивных терминах»? –

+0

В обязательных языках связанный список представляет собой структуру данных с указателем памяти на следующий элемент. На его поверхности ячейка CONS на функциональном языке выглядит схожей, но ожидание того, что такие ячейки фактически будут существовать одновременно в памяти машины, неверно. Попытка концептуализировать функциональные списки, поскольку их можно реализовать на Java или C, приводит к неправильной интуиции о временном использовании пространства функциональных алгоритмов. –

Смежные вопросы