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