Haskell GTK和Monad变压器

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 () -

我正在使用UI制作和应用程序,我需要运行
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