gpt4 book ai didi

haskell - 如何处理 Gtk2Hs 中的应用程序状态

转载 作者:行者123 更新时间:2023-12-04 04:18:17 25 4
gpt4 key购买 nike

尝试学习使用 Gtk2Hs 编写应用程序时,我在弥合事件驱动的 Gtk2HS 和我的模型的持久状态之间的差距时遇到了困难。所以为了简化,假设我有这个简单的应用程序

module Main where

import Graphics.UI.Gtk
import Control.Monad.State

main = do
initGUI
window <- windowNew
button <- buttonNew
set button [buttonLabel := "Press me"]
containerAdd window button

-- Events
onDestroy window mainQuit
onClicked button (putStrLn ---PUT MEANINGFUL CODE HERE---)

widgetShowAll window
mainGUI

我的应用程序的状态是按钮被按下了多少次。查看其他帖子,如 this他们依赖于 MVars 或 IORefs,这对我来说似乎并不令人满意,因为将来我可能会想要重构代码,以便状态存在于它自己的上下文中。

我认为解决方案应该使用 State monad 使用 step 函数,例如:
State $ \s -> ((),s+1)

但我不确定其中的含义,如何在上面的代码中做到这一点,或者即使那个 monad 是我问题的正确解决方案。

最佳答案

基本上有两种方法:

  • 使用某种指针。这是你的IORefMVar方法。您可以将其隐藏在 MonadState 后面。 - 喜欢的界面,如果你喜欢:
    newtype GtkT s m a = GtkT { unGtkT :: ReaderT (IORef s) m a } deriving (Functor, Applicative, Monad, MonadIO)
    runGtkT = runReaderT . unGtkT

    instance MonadIO m => MonadState s (GtkT s m) where
    get = GtkT (ask >>= liftIO . readIORef)
    put s = GtkT (ask >>= liftIO . flip writeIORef s)
  • 拉一个“inversion of control”风格的技巧。编写一个打印数字的回调,然后用打印更高数字的新回调替换自身。

  • 如果您尝试使用 StateStateT直接,你会过得很糟糕。

    关于haskell - 如何处理 Gtk2Hs 中的应用程序状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12002814/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com