【发布时间】:2012-07-07 11:53:15
【问题描述】:
我有一个问题,我不知道该如何解释。我正要问是否有人可以帮助我解决具体问题,但我突然意识到我可以问一个更一般的问题,并希望因此得到更好的一般理解。希望。所以这里是:
当您的程序过于懒惰时,这通常很明显,因为您最终会遇到诸如空间泄漏之类的明显问题。我有相反的问题:我的程序太严格了。我正在尝试tieknots,并发现我尝试做的某些事情会以某种方式击败我需要的懒惰。所以我的一般问题是,如何调试不需要的严格性?
为了完整起见,这是我的具体情况:我在RWS,编写器组件填充地图,阅读器组件观察该地图的最终状态。在完成填充之前,我不能对这张地图做任何严格的事情。在地图中查找值似乎没有问题,例如:
do
m <- ask
val <- m ! key
doSomething val -- etc.
但是(!) 使用error 失败,我宁愿使用我的monad 的fail 失败。所以我想做如下的事情:
do
m <- ask
maybe
(fail "oh noes")
(doSomething)
(lookup key m)
这导致我的程序<<loop>>,我不明白。 似乎在我看来,这应该比使用 (!) 更严格,但显然我错了......
【问题讨论】:
-
看起来你尝试做的事情是不可能的。在您真正拥有地图之前,您无法根据地图做出控制决策(因为地图的内容将取决于控制决策)。
-
@PhilipJF 是
RWST的fail。 -
@augustss :( ... 简单地使用
(!)似乎有点不像Haskell - 如果我要在我的RWS之上分层MaybeT怎么办? -
打结很脆弱,限制了你能做什么。
标签: haskell lazy-evaluation strictness tying-the-knot