【发布时间】:2013-01-25 06:54:09
【问题描述】:
我想使用节点和唯一键的 IntMap 创建一个图形结构。这个话题已经很好地覆盖了here 和here。我通过基本上将 state -> (val,state) 的函数包装在一个新类型中来理解 state monad 的工作原理,这样我们就可以为它创建一个 monad 实例。我已经阅读了很多关于这个主题的内容。我似乎仍然无法理解如何在整个程序执行过程中获得唯一(或只是增量)值。获得一系列连续的 ID 很容易,但是一旦我“runState”退出 monad,我似乎又回到了我开始跟踪当前 ID 的地方。我觉得我被困在单子里了。我考虑的另一个选择是将整个 IntMap 和当前的“下一个”ID 保留为状态,但这似乎非常“必要”和极端。 This 问题非常相似,但没有得到很多答案(或者我可能只是遗漏了一些明显的东西)。在整个程序执行过程中,利用 state monad 获取唯一 ID 的惯用方式是什么?谢谢。
【问题讨论】:
-
实际上我越想,将整个地图封装在一个单子中的想法听起来很有吸引力。我想编写像实际值一样使用 ID(或映射键)的函数,而不必不断地“查找”。但是,现在也很晚了,我整天都在使用 C++,所以我可能没有想清楚。
-
我认为真正的问题是为什么你觉得你必须在
runState之外做一些事情。唯一不能将runState向外推的情况是,当您想要访问阴影的“外部”monad(例如,IO)时。正如 Gabriel 所建议的那样,此时您需要变压器。 -
@Peter,是的,这似乎是真正的问题。
标签: haskell state-monad