Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何处理Gtk2Hs中的应用状态_Haskell_State Monad_Gtk2hs - Fatal编程技术网

Haskell 如何处理Gtk2Hs中的应用状态

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

试图学习使用GTK2H编写应用程序,我发现很难弥合事件驱动的GTK2H和模型的持久状态之间的差距。为了简化,我们假设我有一个简单的应用程序

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
    ,你会过得很不愉快。

    非常感谢,这真是大开眼界!非常感谢,这真的让人大开眼界!