Gtk2Hを使用してアプリケーションを作成する方法を学ぼうとすると、イベント駆動型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モナドを使用する必要があると思います。
State $ \s -> ((),s+1)
しかし、その意味、上記のコードでそれを行う方法、またはそのモナドが私の問題の正しい解決策であるかどうかについてはわかりません。