Haskell GTK和Monad变压器
我正在使用UI制作和应用程序,我需要运行Haskell GTK和Monad变压器,haskell,gtk,monads,monad-transformers,gtk2hs,Haskell,Gtk,Monads,Monad Transformers,Gtk2hs,我正在使用UI制作和应用程序,我需要运行StateT和ReaderT超过IO的代码,我正在使用Graphics.UI.Gtk作为UI,我有以下问题: 我需要的是,当点击某个按钮时,它会调用一个有签名的函数 tryAttack :: Int -> ReaderT Builder (StateT BattleState IO) Bool 但是在GTK中,在单击on函数上,它接受一个IO()参数: onClicked :: ButtonClass b => b -> IO () -
StateT
和ReaderT
超过IO
的代码,我正在使用Graphics.UI.Gtk
作为UI,我有以下问题:
我需要的是,当点击某个按钮时,它会调用一个有签名的函数
tryAttack :: Int -> ReaderT Builder (StateT BattleState IO) Bool
但是在GTK
中,在单击on
函数上,它接受一个IO()
参数:
onClicked :: ButtonClass b => b -> IO () -> IO (ConnectId b)
我怎样才能使“愚弄”这个点击
函数,以为tryAttack
是IO()
显然,
tryAttack
代码是临时的。您需要打开读卡器monad,然后声明monad以获得bool结果:
(ok,newBattleState) <- runStateT (runReaderT (tryAttack i) builder) battleState
(好的,newBattleState)
tryAttack :: Int -> ReaderT Builder (StateT BattleState IO) Bool
tryAttack i = return True
(ok,newBattleState) <- runStateT (runReaderT (tryAttack i) builder) battleState