2

私は UI を使用してアプリケーションを作成しており、 aStateTおよび a ReaderToverIOにあるコードを実行する必要があります。UI に使用Graphics.UI.Gtkしていますが、次の問題があります。

特定のボタンをクリックすると、署名を持つ関数が呼び出される必要があります

tryAttack :: Int -> ReaderT Builder (StateT BattleState IO) Bool

しかし ではGTKclickedOn関数では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コードは一時的なものです。

4

1 に答える 1

2

bool の結果を得るには、reader モナドをアンラップしてからステート モナドにする必要があります。

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