2

我正在使用 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功能“傻瓜”认为tryAttackIO ().

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代码是临时的。

4

1 回答 1

2

您需要解开 reader monad 然后声明 monad 以获得 bool 结果:

(ok,newBattleState) <- runStateT (runReaderT (tryAttack i) builder) battleState
于 2013-07-19T04:50:23.147 回答