【发布时间】:2013-11-13 23:44:23
【问题描述】:
所以我正在尝试使用 State 来实现 Haskell 游戏,作为游戏的一部分,我想实现一些方法来保存当前玩家的姓名并在调用时检索它。我有辅助函数 popStack 和 pushStack 分别将值弹出和推送到堆栈中。
当前代码:
import Control.Monad.State
data Gamestate = Gamestate {
gamestack :: [String],
gamememory :: String
}
type NewGameState = State GameState
popStack :: NewGameState String
popStack = state $ \st -> case gamestack st of
[] -> (0.0,st)
x:xs -> (x,st { gamestack = xs })
pushStack :: String -> NewGameState ()
push d = modify $ \st -> st { gamestack = d : gamestack st }
我为 saveName 和 getName 提供了以下代码。
saveName :: NewGameState ()
saveName = do
memory <-head
pushStack $ x
getName :: NewGameState ()
getName = do
memory <- head gamestack
popStack $ memory
上面的代码 sn-ps 返回类型错误。我不太了解状态单子。那么如何使用 saveName 将游戏栈顶部的当前玩家名称复制到游戏内存中,并在使用 getName 时将游戏内存推送到游戏栈顶部?
对不起,如果它有点混乱。我是一名 ESL 演讲者。提前致谢。
【问题讨论】:
-
您应该包含您收到的错误消息,但是我注意到您在
saveName和memory <- head中有一个明显的错误。你处于状态单子,而不是函数单子。 -
为什么你认为你需要一个堆栈?键/值存储(可能是 Map)可能会更有用。堆栈允许您推送多个对象;如果你这样做,你将如何从堆栈中的其他东西下检索玩家的名字?你怎么知道哪些项目是哪些?如果你只把名字放在那里,没有别的,为什么还要麻烦堆栈呢?
标签: haskell functional-programming state