我正在构建代码以获得理解,实际上是一个纸牌求解器。我有一个简单的蛮力实现,它使用 State monad,实际上只是为了证明我可以使用它(它只记录评估的每个动作的计数)。但是现在我想使用 Unboxed Mutable 数组来记录访问过的电路板,从而在我到达已经通过另一条路径访问过的电路板位置时对路径进行快捷评估。似乎 ST monad 不允许我线程隐式状态,但我必须使用 ST(或 IO)才能访问 Mutable 数组。所以看来我必须结合两个 Monad - State 来线程化状态(实际上将包括一个 Mutable 数组),另一个(ST)来获得 Mutable 数组函数。
- 这是正确的吗?
- 如果是这样,是否有比 Data.Array.ST/Control.Monad.ST/Control.Monad.ST 和 mtl 的(规范?)组合更好的选择?
- 如果我真的走这条路,我堆叠 ST 和 State 的顺序是否重要?
- 我是否应该考虑基于 ST 或 State 中的一个或两个来滚动我自己的单个 Monad 以避免使用 monad 转换器?