【问题标题】:State monad and gtk2hs状态单子和 gtk2hs
【发布时间】:2013-10-07 13:26:54
【问题描述】:

我试图在我的 GUI 应用程序上保留一些状态,以便我可以根据用户输入构造一个值列表。但是我很难理解 State monad 所以......
这是一些测试代码来说明我想要什么(很明显它不会编译,甚至没有尝试过):

-- // --

main :: IO ()
main = do
   initGUI
   build <- builderNew
   builderAddFromFile build "test.glade"

   mainWindow <- builderGetObject build castToWindow "mainWindow"
   mainWindow `onDestroy` mainQuit

   mQuit <- builderGetObject build castToButton "quit"
   mQuit `onClicked` mainQuit

   entry   <- builderGetObject build castToEntry "entry"
   mUpdate <- builderGetObject build castToButton "update"

   mUpdate `onClicked` do
      txt <- entryGetText entry
      runState (addToList txt) []
      return ()

   widgetShowAll mainWindow
   mainGUI

-- // --

addToList :: String -> State [String] ()
addToList ent = get >>= \x -> put $ x ++ [ent]

无论如何,我认为我应该使用 StateT 而不是 State,但它在我的脑海中完全是一团糟(已经阅读了这么多 tutos ......)。 即使它有效,也不是很好,因为我在每个循环中都给出了 [] 的初始状态。 问题是如何编写函数 addToList 以便每次按下更新按钮时,用户输入都会添加到某个状态(先前输入的列表)?

【问题讨论】:

    标签: haskell state-monad gtk2hs


    【解决方案1】:

    首先State已经是StateT

    type State s = StateT s Identity
    

    也许你需要使用 StateT 1 级,像这样:

    runStateT $
    put []
    lift $ mUpdate `onClicked` do
       txt <- lift $ entryGetText entry
       listWas <- get  
       put $ txt : listWas   --in reverse order
       return ()
    

    【讨论】:

    • 我有一个问题,我在哪里定义我的初始状态(这里是 [] 的 listWas 值)?
    • 虽然您对使用更高级别的建议已经死了,但对于 gtk2hs 应用程序来说,一般来说使用 Control.Concurent.MVar 模块可能会更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2018-12-15
    • 2010-12-29
    • 1970-01-01
    • 2017-05-15
    相关资源
    最近更新 更多