【发布时间】:2018-09-05 15:43:01
【问题描述】:
我知道普通的State 是如何工作的(编辑:显然不是!)。
如果我需要创建一个数组,并且一次创建整个数组不方便,我可以创建一个STArray,填充它,然后冻结并返回一个普通的不可变数组给用户。
现在假设我需要同时创建两个不同类型的数组。
更一般地说,我可能想创建一个具有可变节点的任意图,逐个节点修改它一段时间,就像我会逐个单元格修改STArray 一样,然后立即冻结整个图并返回正常的不可变数据。
我不想诉诸 IOArrays 或 IO monad 中的任何东西。我有哪些选择?
【问题讨论】:
-
为什么不能只使用
STArrays? -
@leftaroundabout 假设我想修改 array1 中的一个单元格,该单元格是根据 array2 中的单元格计算的。然后修改 array2 中的一个单元格,根据 array1 中的单元格计算。重复直到完成。这可能只用两个 STArrays 吗?我没有办法……
-
@leftaroundabout 嗯,我想这可以用 monad 转换器来完成。堆叠这两种状态并根据需要提升。这是正确的吗?
-
@n.m.为什么要使用单子变压器?为什么不把它们都放在ST? (好吧,由于量词,我认为它不适用于 runSTArray,但我觉得应该有办法做到这一点 - 直接使用 unsafeFreeze ?)
-
@Cubic 不知何故,我的印象是你只能在 runST 中拥有一个状态。完全错误。
标签: haskell state-monad