尝试学习使用 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
我的应用程序的状态是按钮被按下了多少次。看到其他类似这样的帖子,他们依赖于 MVar 或 IORef,这对我来说似乎并不令人满意,因为将来我可能会想要重构代码,以便状态存在于自己的上下文中。
我认为解决方案应该使用 State monad 使用 step 函数,例如:
State $ \s -> ((),s+1)
但我不确定其中的含义,如何在上面的代码中做到这一点,或者即使那个 monad 是我问题的正确解决方案。