在Haskell中,如何冻结/解冻O(1)中可变矢量的可变矢量?

I'm using MVector's from the vector library to represent some adjacency list for a graph.

我希望某些图形函数将可变图形作为输入,因为它们可能会更改它。并且其他一些函数应将不可变图作为输入,因为它们无意于更改它。

到目前为止,我拥有的每个图形函数都将可变图形作为输入。不好

I like how unsafeFreeze from here https://hackage.haskell.org/package/vector-0.12.1.2/docs/Data-Vector-Generic.html allows to get an immutable version of a vector in O(1). I believe that under the hood it really does nothing else than casting the type.

本质上,我希望能够以零成本频繁地“不安全”冻结任何复杂的可变结构,以便可以将其传递给需要不可变参数的函数。就像任何常见的编程语言一样。尽管前缀为“ unsafe”,但我认为如果将冻结的结构用作不可变参数后立即将其冻结,这并不是不安全的做法。垃圾收集不会发生,因为不会丢弃可变版本,冻结版本应该指向与可变版本相同的内存表示形式。

What I'm having trouble with is freezing a graph seen as a mutable vector of mutable vectors. The only way I figured out so far, is to unsafeFreeze each mutable vector inside the main vector, and finally unsafeFreeze the main vector. But that is O(n) in the length of the main vector. This is not acceptable.

需要澄清的是,仅靠不安全地冻结主向量是不够的,因为它使我冻结了可变向量的向量。从理论上讲,应该有一种免费冻结所有内容的方法,因为内部内存表示形式根本不应该更改。它应该只是演员。

有什么方法可以将可变矢量的可变矢量冻结在(非常便宜)O(1)中?

请不要回答“使用不可变的结构。句点。”。我的观点是,图表,不变性和性能常常不能很好地结合在一起。

谢谢,