gpt4 book ai didi

haskell - 具有不同类型中断的状态循环

转载 作者:行者123 更新时间:2023-12-03 21:46:48 26 4
gpt4 key购买 nike

我正在尝试将以下有状态命令式代码转换为 Haskell。

while (true) {
while (get()) {
if (put1()) {
failImmediately();
}
}
if (put2()) {
succeedImmediately();
}
}

两者 put1put2读取系统状态并修改它。 get可以为简单起见只读取状态。 failImmediately应该跳出无限循环并呈现一种结果, succeedImmediately也应该爆发,但呈现不同的结果。

我尝试使用的是 State Env Result哪里 Env代表环境状态和 Result就像 Either Failure Success一些定制 FailureSuccess .

我对整个结果表达式应该折叠成 Failure 的要求很挣扎。/ Success一旦产生其中之一(打破循环),否则继续前进。

我的一个想法是使用 Either Exit ()哪里 data Exit = Success | Failure并使用 StateT以某种方式表现 LeftEither好像 Either monad 是否被链接,即忽略任何后续 Action 。

我真的很感激任何可以实现与上面的代码片段相同的行为的 Haskell 代码的灵感或示例。

编辑:精炼版移至单独的问题“ Stateful computation with different types of short-circuit (Maybe, Either)”。

最佳答案

使用@chi 回答中的工具包,只是强调您不需要 ContT 的全部功能| , EitherT 的直接短路语义足够:

import Control.Monad.Trans.Either

data Result a = Failure | Success a

foo :: EitherT (Result Int) IO Int
foo = forever $ do
whileM get $ do
whenM put1 $ do
left Failure
whenM put2 $ do
left $ Success 42

run :: (Monad m) => EitherT (Result a) m a -> m (Maybe a)
run act = do
res <- runEitherT act
return $ case res of
Left Failure -> Nothing
Left (Success x) -> Just x
Right x -> Just x

-- whenM / whileM and get/put1/put2 as per @chi's answeer

关于haskell - 具有不同类型中断的状态循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32391924/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com