使用StateT
monad 转换器,我可以创建与StateT s [] a
同构的类型s -> [(a, s)]
。现在我更喜欢使用STT
monad 转换器,因为我想拥有多个不同类型的可变变量,并且希望能够根据早期计算的结果随意实例化它们。
STT
但是,明确提及的链接文档:
这个单子转换器不应该与可以包含多个答案的单子一起使用,例如列表单子。原因是状态令牌将在不同的答案中重复,这会导致坏事发生(例如失去参考透明度)。安全单子包括单子 State、Reader、Writer、Maybe 以及它们相应的单子转换器的组合。
那么我的选择是什么?
要完全清楚:
- 我所追求的是非确定性。我希望能够分叉我的计算,给每个分支它自己的整个状态的副本。
- 我不太介意并行性,因为性能不是我最关心的问题。
- 我不追求的是并发性:不同的计算分支不应该共享可变变量;相反,他们都应该在自己的原始可变变量副本上工作。
编辑:(编辑编辑:以下反例无效,ListT
不应应用于非交换单子和ST
。State
)我开始意识到,STT
按照 StateT
有了它,我们可以构建一个 type STT sloc (ListT (ST sglob)) a
。这里,sglob
是全局状态sloc
的名称,而是局部状态的名称。* 现在我们可以使用全局状态在线程之间交换局部状态引用,从而有可能获得对未初始化变量的引用。
*为了比较,对应的StateT
结构是StateT sloc (ListT (State sglob)) a
,它同构于sloc -> sglob -> ([(a, sloc)], sglob)
.