Нет, но может случиться что-то еще лучше.
Data.Vector создается с использованием "stream fusion" .Это означает, что если последовательность операций, которые вы выполняете для построения, а затем разрушения вектора, может быть слита, , то сам вектор никогда не будет даже построен , и ваш код превратится в оптимизированный цикл.
Fusion работает, превращая код, который будет строить векторы, в код, который собирает и разбивает потоки, а затем переводит потоки в форму, которую компилятор может видеть для выполнения оптимизации.
Итак, кодкоторый выглядит как
foo :: Int
foo = sum as
where as, bs, cs, ds, es :: Vector Int
as = map (*100) bs
bs = take 10 cs
cs = zipWith (+) (generate 1000 id) ds
ds = cons 1 $ cons 3 $ map (+2) es
es = replicate 24000 0
, несмотря на то, что кажется, что он накапливается и разрушается, довольно много очень больших векторов могут сплавляться вплоть до внутреннего цикла, который вычисляет и добавляет только 10 чисел.Делать то, что вы предложили, сложно, потому что это требует, чтобы вы знали, что нигде не существует ссылок на термин, что накладывает затраты на любую попытку скопировать ссылку в среду.Более того, он плохо взаимодействует с ленью.Вам нужно приложить небольшие аффинные дополнения к тому, что вы явно еще не оценили.Но делать это в многопоточной среде страшно, склонно к гонке, и трудно понять, как это сделать.