Я только что опубликовал этот код:
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
?
indexed
— это просто псевдоним для перегруженная версия того же, которая работает путем преобразования входного вектора в поток и из потока. Таким образом,indexed
в реализованном виде всегда будет возвращать новый вектор, а не вид поверх старого. Я думаю, разработчикиVector
решили, что в данном случае слияние важнее, чем совместное использование. Я бы не обязательно хотел полагаться на такое поведение. - person Benjamin Hodgson♦   schedule 14.11.2016