2013-07-19 30 views
2

我正在與UI應用程序,我需要運行的代碼是在StateTReaderTIO,我使用Graphics.UI.Gtk的UI和我有以下問題:哈斯克爾GTK和單子變形金剛

我需要單擊某個按鈕時,它調用具有簽名

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代碼是暫時的。

回答

2

你需要解開讀者單子,然後狀態單子拿到布爾結果:

(ok,newBattleState) <- runStateT (runReaderT (tryAttack i) builder) battleState