gpt4 book ai didi

scala - 如何堆叠 State 和 IO monad

转载 作者:行者123 更新时间:2023-12-03 21:19:04 25 4
gpt4 key购买 nike

在 Connect4 游戏中:

  • 我们从一个空网格开始
  • 两名玩家将 x 和 o 放在网格上
  • 第一个达到 4 个棋子的玩家获胜!
  • 这是一个基于文本的控制台游戏

  • 我的想法是:
  • 在游戏的每一步,网格都从一种状态过渡到另一种状态
  • 因此我需要使用 State monad
  • 并且因为这是一个基于控制台的应用程序,涉及 io
  • 在这种情况下,我还需要使用 IO monad

  • 这种想法正确吗?

    假设以上是正确的,以下哪一项是正确的?
  • 类型 StateInIO[S,A] = IO[State[S,A]]
  • type IOInState[S,A] = State[S,IO[A]]

  • 我赞成第二种选择,对我来说更有意义。

    我可以用这种方式堆叠这些 monads (State, IO) 吗?

    最佳答案

    State在猫中实际上被定义为 monad 转换器的类型别名 StateT[F[_], S, A]哪里F[_]是效果类型。此别名修复了 F[_]Eval ,所以它看起来像 type State[S, A] = StateT[Eval, S, A] .在您的情况下,您应该定义自己的 IO 状态,例如 type IOState[S, A] = StateT[IO, S, A] .
    StateT[IO, S, A]对应于 IO[S => IO[(S, A)]]我觉得它是更有用的堆栈,因为您现在可以轻松地将使用此堆栈的代码与使用 IO 的应用程序的其余部分连接起来。

    您可以通过 StateT 找到更多关于使用效果 monad 堆叠状态 monad 的信息。在第 interleaving effects 节在 State from cat 的文档中。

    关于scala - 如何堆叠 State 和 IO monad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56611849/

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