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