我正在使用 UI 制作和应用程序,我需要运行 aStateT
和 a ReaderT
over中的代码IO
,我正在使用Graphics.UI.Gtk
UI 并且遇到以下问题:
我需要在单击某个按钮时调用一个具有签名的函数
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
代码是临时的。