2013-10-07 97 views
0

我想在我的GUI應用程序中保留一些狀態,以便我可以從用戶輸入構建一個值列表。但我無法理解國家單子所以...
下面是一些測試代碼來說明我想要的東西(很明顯它不會編譯,甚至還沒有tryed於):State monad和gtk2hs

-- // -- 

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,以便每次按下更新按鈕時,用戶輸入都會添加到某個狀態(之前輸入的列表)?

回答

0

首先,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() 
+0

我有一個問題,我在哪裏定義我的初始狀態(這裏是[]的listWas值)? – Sarfraz

+0

@Sarfraz更新 – wit

+0

儘管你的建議已經停滯不前,但對於gtk2hs應用來說,使用Control.Concurent.MVar模塊可能會更好。 – Sarfraz