如何解决如何使用IO和GTK更新main中的“变量”
我对Haskell还是很陌生,所以请原谅我的幼稚方式。 我试图在GTK(gtk2hs)的主循环中使用“全局变量”来保存/编辑我要编程的游戏状态,以及表示当前是否正在玩游戏的布尔型。 / p>
我目前的方法是为这两种方法定义数据类型:
data GameBool = GameBool { gameBoolvalue :: Bool } deriving (Show)
main :: IO ()
main = do
initGUI -- inits GTK
-- do GUI stuff
gameBool <- initGameBool
on button buttonActivated $ callbackNewGame gameBool
mainGUI -- runs GTK loop
initGameBool = do
return $ GameBool False
callbackNewGame :: GameBool -> IO ()
callbackNewGame gameBool = do
-- Do stuff to check if a game is running in if then else etc.
updateGameBool gameBool True
putStrLn "New Game Started" -- This is not what i do,but represents it well
updateGameBool gameBool b = do
return $ gameBool { gameBoolvalue = b}
尽管这不会更新我的gameBoolvalue,但它仍然为False。
我尝试了Control.Lens而不是记录语法(updateGameBool函数),但是结果以我不理解的可怕崩溃而告终。 (是的,我将TemplateHaskell添加到LANGUAGE并执行了makeLenses''GameBool),这是这样的:
set gameBoolvalue True gameBool
结果:
error:
couldn't match type 'Bool'
with 'GameBool -> Identity (IO a0)'
Expected type: ASetter GameBool (IO a0) a1 Bool
Actual type: GameBool -> Bool
In the first argument of 'set',namely 'gameBoolvalue'
In a stmt of a 'do' block: set gameBoolvalue True gameBool
我了解我的实际类型,但不能理解它想要告诉我的内容,因为它不遵循set AT ALL的API,也不是类型。
我怀疑我误解了do块/变量中的交互/声明。是的,我知道它们并不是真正的变量,如果可以的话,我将使用一个循环将当前值简单地传递给下一个迭代,但是GTK使我无法执行。 我只想更新Bool(以及我的游戏状态,但我认为那是相同的错误)。
任何帮助将不胜感激!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。