【发布时间】:2015-09-04 06:59:00
【问题描述】:
我正在尝试将以下有状态命令式代码转换为 Haskell。
while (true) {
while (get()) {
if (put1()) {
failImmediately();
}
}
if (put2()) {
succeedImmediately();
}
}
put1 和 put2 都读取系统的状态并对其进行修改。 get 可以为简单起见读取状态。 failImmediately 应该跳出无限循环并呈现一种结果,succeedImmediately 也应该跳出但呈现不同的结果。
我尝试使用的是State Env Result,其中Env 表示环境状态,Result 类似于Either Failure Success,用于某些自定义Failure 和Success。
一旦产生其中一个(打破循环),整个结果表达式应该折叠到Failure/Success 中,否则继续运行。
我的一个想法是使用Either Exit () where data Exit = Success | Failure 并使用StateT 以某种方式对Either 的Left 进行操作,就好像Either 是被链接的monad,即忽略任何后续操作。
如果能获得与上述 sn-p 相同的行为,我将非常感谢任何灵感或 Haskell 代码示例。
编辑:改进版移至单独的问题“Stateful computation with different types of short-circuit (Maybe, Either)”。
【问题讨论】:
-
您应该查看
EitherT (State Env Result)。让我知道该提示是否不够,您需要更多详细信息:) -
我觉得这可能是我需要的,但我完全不知道如何在这种情况下使用它:(。如果你能详细说明我会永远如此感激不尽。
标签: haskell monads monad-transformers state-monad