Haskell GTK 和 Monad 变压器

标签 haskell gtk monads monad-transformers gtk2hs

我正在使用 UI 制作应用程序,我需要通过 IO 运行 StateTReaderT 中的代码,我我正在使用 Graphics.UI.Gtk 作为 UI,但遇到以下问题:

我需要当单击某个按钮时它会调用具有签名的函数

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

最佳答案

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

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

关于Haskell GTK 和 Monad 变压器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17736560/

相关文章:

haskell - Yesod 中自定义字段中的静态路由

haskell - Monad Bind 坚持不同的类型?

haskell - 无法让 (->) r monad 与 SDL2 渲染一起工作

scala - 警告 :(55, 56) MoldPiece[PressureData(Int, Prettyprint.YesNo)] 上尚不存在 `withFilter' 方法,请改用 `filter' 方法

python - 将 CellRendererToggle 的单行设置为不一致

haskell - 'undefined' 如何在 Haskell 中工作

haskell - 带有 Keter 和 Cloudflare 的免费 SSL 的 Yesod 网络应用程序

haskell - 重载 Haskell 中的内置函数

c++ - 我如何在 GTK 中获得键盘和鼠标输入?

c - 如何让 GTK 识别我创建的模板?