如何使用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 (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...