"unsafe" 与 Data.Vector 的 unsafeFreeze/unsafeThaw 究竟如何?

Just how "unsafe" are Data.Vector's unsafeFreeze/unsafeThaw?

documentation for Data.Vector.unsafeFreeze 说:

Unsafe[ly] convert a mutable vector to an immutable one without copying. The mutable vector may not be used after this operation.

我想准确描述 "unsafe" 在这里的意思。从实验上看,"only" 似乎暗示对原始可变向量的进一步修改将导致 unsafeFreeze 返回的不可变向量不再是纯向量:

$ import qualified Data.Vector as V
$ import qualified Data.Vector.Mutable as MV
$ import Control.Monad.ST
$ :{
$ |runST $ do
$ |        mv <- V.thaw $ V.fromList [0..10]
$ |        v <- V.unsafeFreeze mv
$ |        MV.write mv 0 (-1)
$ |        MV.write mv 1 (-2)
$ |        v' <- V.freeze mv
$ |        v'' <- V.unsafeFreeze mv
$ |        return (v, v', v'')
$ |:}
([-1,-2,2,3,4,5,6,7,8,9,10],[-1,-2,2,3,4,5,6,7,8,9,10],[-1,-2,2,3,4,5,6,7,8,9,10])

我可以想象修改 "unsafe" 冻结中使用的源会做各种粗糙的事情,这会导致更糟糕的行为,例如段错误。我很快就不知所措 a.t.m。不幸的是,试图阅读有关不安全操作的源代码。

我可以相信所说的杂质是这些操作的唯一方式吗"unsafe"?

对于上下文:我需要在一个典型的不可变数据结构上实现各种修改算法,并且在内部可变性的范围内不重用它的 public-facing API 会非常不方便(因为 AFAICT 没有办法一般地 access 可变和不可变向量)。 (Ab) 当我需要使用 API 时使用 unsafeFreeze 将是完美的逃生口,只要我不让自己在路上遇到更多不愉快的副作用。

此使用模式可能会崩溃:请参阅此 message 以供参考。原因是改变不可变数组会创建次要 GC 根,这些次要 GC 实际上对次要 GC 不可见。仅当您的数组在旧 GC 代并且写入的对象在新代时才会出现此错误,因此您不会通过最简单的测试触发它。