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
在这里使用是安全的,因为我只解冻了xs
indexed
版本。然而,然后我发现元组的未装箱的向量 - 就像这里的索引值对 - 实际上存储为两个未装箱的向量,一个用于索引,一个用于值。因此,ST
根本不会实际生成新的值向量似乎是合理的,而只是将其与索引向量耦合。在这种情况下,xsi
- 修改xs
可能会弄乱True
。
经过测试,这似乎并没有发生。 我可以依赖于此,还是应该更好地使用indexed
?