我正在制作并使用UI进行应用,我需要运行StateT
和ReaderT
上IO
的代码,我正在使用Graphics.UI.Gtk
用户界面和我有以下问题:
我需要在单击某个按钮时调用具有签名的函数
tryAttack :: Int -> ReaderT Builder (StateT BattleState IO) Bool
但在GTK
中,clickedOn
函数需要IO ()
个参数:
onClicked :: ButtonClass b => b -> IO () -> IO (ConnectId b)
如何让clickedOn
函数“傻瓜”地认为tryAttack
是IO ()
。
attackButton builder leftTR i = do
moveButton <- builderGetObject builder castToButton ("move" ++ show i)
onClicked moveButton $ do
ok <- tryAttack i
if ok
then hideAndShow builder castToTable "fight" "option"
else return ()
tryAttack :: Int -> ReaderT Builder (StateT BattleState IO) Bool
tryAttack i = return True
显然tryAttack
代码是暂时的。
答案 0 :(得分:2)
你需要打开阅读器monad,然后声明monad以获得bool结果:
(ok,newBattleState) <- runStateT (runReaderT (tryAttack i) builder) battleState