Haskell 如何处理Gtk2Hs中的应用状态
试图学习使用GTK2H编写应用程序,我发现很难弥合事件驱动的GTK2H和模型的持久状态之间的差距。为了简化,我们假设我有一个简单的应用程序Haskell 如何处理Gtk2Hs中的应用状态,haskell,state-monad,gtk2hs,Haskell,State Monad,Gtk2hs,试图学习使用GTK2H编写应用程序,我发现很难弥合事件驱动的GTK2H和模型的持久状态之间的差距。为了简化,我们假设我有一个简单的应用程序 module Main where import Graphics.UI.Gtk import Control.Monad.State main = do initGUI window <- windowNew button <- buttonNew set button [buttonLabel := "Pr
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
但我不确定这其中的含义,如何在上面的代码中做到这一点,甚至不确定monad是否是解决我问题的正确方法。基本上有两种方法:
IORef
或MVar
方法。如果愿意,您可以将其隐藏在类似于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)
如果您试图直接使用
State
或StateT
,您会遇到麻烦。基本上有两种方法:
IORef
或MVar
方法。如果愿意,您可以将其隐藏在类似于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)
如果你试图直接使用
State
或StateT
,你会过得很不愉快。非常感谢,这真是大开眼界!非常感谢,这真的让人大开眼界!