我需要学习使用 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。基本上就像将一个额外的参数隐式传递给所有 monadic 操作。
在您的游戏中,您似乎真的想要改变某些东西(即回合或游戏状态)。在这种情况下,一个 State
monad 可能更容易使用。
为了使用Reader
您必须将所有依赖于状态的操作分组,在 monad 中执行它们,然后在 monad 之外更改状态并使用修改后的状态运行新的 monadic 计算等。这听起来很麻烦。
请注意,使用 Reader
实际上类似于使用 State
.简单地说:put
不允许操作(和衍生)。所以你可以使用 Reader
开始写作并且如果您遇到想要修改状态的地方,您知道最好使用 State
.
反之亦然:首先使用 State
如果您最终从未修改状态,请将其替换为 Reader
.
关于haskell - 在这个回合制游戏中使用 Reader monad 是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31090228/