Безопасно ли unsafeThaw индексированный неупакованный вектор?

Я только что опубликовал этот код:

import qualified Data.Vector.Unboxed as VU
import qualified Data.Vector.Algorithms.Intro as VAlgo

argSort :: (Ord a, VU.Unbox a) => VU.Vector a -> VU.Vector Int
argSort xs = VU.map fst $ VU.create $ do
    xsi <- VU.unsafeThaw $ VU.indexed xs
    VAlgo.sortBy (comparing snd) xsi
    return xsi

Я рассуждал так: unsafeThaw< /a> безопасно использовать здесь, потому что я размораживаю только indexed версия xs. Однако затем мне пришло в голову, что неупакованные векторы кортежей — как эти пары индекс-значение здесь — действительно хранятся как два неупакованных вектора, один для индексов и один для значений. Следовательно, кажется вероятным, что indexed на самом деле вообще не будет генерировать новый вектор значений, а просто соединит его с индексным вектором. В этом случае ST-модификация xsi может испортить xs.

Однако при тестировании этого не происходит. Могу ли я положиться на это или лучше использовать thaw?


person leftaroundabout    schedule 13.11.2016    source источник
comment
Мне кажется, что это несчастный случай с реализацией. Я бы не стал на это полагаться.   -  person Carl    schedule 13.11.2016
comment
Это кажется достойным обсуждения для векторных разработчиков. По крайней мере, неизменяемый вектор нельзя использовать после того, как эта операция не кажется четко определенной или недостаточной документации, и я мог бы легко увидеть, как я случайно использую unsafeThaw в этой ситуации, не задумываясь об этом.   -  person jberryman    schedule 14.11.2016
comment
Беглый взгляд на исходный код показывает, что indexed — это просто псевдоним для перегруженная версия того же, которая работает путем преобразования входного вектора в поток и из потока. Таким образом, indexed в реализованном виде всегда будет возвращать новый вектор, а не вид поверх старого. Я думаю, разработчики Vector решили, что в данном случае слияние важнее, чем совместное использование. Я бы не обязательно хотел полагаться на такое поведение.   -  person Benjamin Hodgson♦    schedule 14.11.2016