gpt4 book ai didi

Haskell State monad 和 monadic 守卫

转载 作者:行者123 更新时间:2023-12-04 06:29:57 25 4
gpt4 key购买 nike

我有一个小任务来模拟涉及状态的一元代码中的命令式循环,并且应该没有 IO,任务是在条件下退出循环,这是我的尝试:

> execState (forever $ modify (+1) >>= \x -> guard $ x < 5 ) 1

所以我希望在这里得到类似 4 的东西,而是得到这个神秘的信息:
<interactive>:1:43:
No instance for (MonadPlus Data.Functor.Identity.Identity)
arising from a use of `guard' at <interactive>:1:43-47
Possible fix:
add an instance declaration for
(MonadPlus Data.Functor.Identity.Identity)
In the first argument of `($)', namely `guard'
In the expression: guard $ x < 5
In the second argument of `(>>=)', namely `\ x -> guard $ x < 5'

没有 guard ,整个事情都可以正常工作,但出于某种原因,它似乎完全讨厌 guard 。

更新 :
最后我让它运行起来了,感谢 hammar 的类型提示。尽管它什么都没有返回,但我知道它运行了 5 次,这很酷,不知道它现在有什么用处。
runStateT (forever $ do { modify (+1); x <- get; guard $ x < 5 } :: StateT Int Maybe Int) 1

最佳答案

正如错误消息试图告诉你的那样,guard要求您使用的 monad 必须是类型类 MonadPlus 的实例.

在本例中,您使用的是 State monad,实际上是一个 StateT Identity 顶部的变压器单子(monad)。有一个MonadPlus StateT 的实例,但它要求底层 monad 必须是 MonadPlus还有,Identity不是。

对于您的示例,您可以尝试类似

> let loop = modify (+1) >> get >>= \x -> if x < 5 then loop else return x in execState loop 1

关于Haskell State monad 和 monadic 守卫,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5541828/

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