Haskell GTK и Monad Transformers

Я создаю приложение с пользовательским интерфейсом, и мне нужно запустить код, который находится в 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 является временным.


person chamini2    schedule 19.07.2013    source источник


Ответы (1)


Вам нужно развернуть монаду читателя, а затем констатировать монаду, чтобы получить результат bool:

(ok,newBattleState) <- runStateT (runReaderT (tryAttack i) builder) battleState
person Ankur    schedule 19.07.2013