haskell - 在这个回合制游戏中使用 Reader monad 是否正确?

标签 haskell monads

我需要学习使用 Reader monad。 (还有 Writer 和 State)。

我所做的游戏竞赛总是包含在整个游戏中有效的全局参数。还有一堆只在一个回合内有效的参数。

我结束了所有最新的比赛,其中有很多功能几乎都将 Game 和 Turn 作为输入参数。

在阅读了 reader monad 之后,我正在考虑拥有:

data Game = Game AllNeeded StrategicPositions AndGameRelatedStuffs
data Turn = Turn PlayersPositions AndTurnDependentStuffs 

对于每个循环,当我收到转弯相关数据时,我计划有一个变量 Reader Game Turn :
turnReader = Reader currentGame currentTurn
let actionToPerform = play turnReader

你认为这是 Reader monad 应用的好例子吗?
你认为我可以/应该蒙住眼睛学习在这种情况下使用 Reader monad 吗?或者有更合适的 monad 吗,比如 State ?

最佳答案

Reader当您想要在计算中读取不可变状态时,将使用 monad。基本上就像将一个额外的参数隐式传递给所有 m​​onadic 操作。

在您的游戏中,您似乎真的想要改变某些东西(即回合或游戏状态)。在这种情况下,一个 State monad 可能更容易使用。

为了使用Reader您必须将所有依赖于状态的操作分组,在 monad 中执行它们,然后在 monad 之外更改状态并使用修改后的状态运行新的 monadic 计算等。这听起来很麻烦。

请注意,使用 Reader实际上类似于使用 State .简单地说:put不允许操作(和衍生)。所以你可以使用 Reader 开始写作并且如果您遇到想要修改状态的地方,您知道最好使用 State .
反之亦然:首先使用 State如果您最终从未修改状态,请将其替换为 Reader .

关于haskell - 在这个回合制游戏中使用 Reader monad 是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31090228/

相关文章:

haskell - 在 Haskell 中,是否有无穷大::Num a => a?

haskell - 为什么 XMonad 的提示对我不起作用?

haskell - 如何提高 BitGet 性能

scala - 如何将函数的返回类型指定为(任意)monad?

haskell - 在类型级别迭代符号列表

haskell - 为什么 `-`(减号)不适用于运算符(operator)部分?

haskell - Haskell 中状态的 Functor/Applicative 实例

haskell - 单声道,组成和计算顺序

haskell - 将函数及其参数提升到不同的一元上下文

haskell - 如何处理 monadic 返回值 `m (Maybe Foo)` ?