椿の日記

たぶんプログラムの話をします

wxHaskellのイベントハンドラと、アプリケーションの状態の記憶

wxHaskellでは、ウィンドウでのイベントをIOモナドの関数で処理するための仕組みがあります。


例えば「ファイル→終了」のメニューアイテムに「close f」というウィンドウfを閉じる処理を割り当てるなら次のようなIOモナドによってイベントハンドラを設定します。(マウス移動やらなにやらも似たような感じ)

  do
    file <- menuPane [text := "ファイル(&F)"]
    quit <- menuItem file [text := "終了(&Q)"]
    set quit [on command := close f]

このset関数の存在を見て明らかな感じがしますが、ウィンドウの状態はHaskellの変数として定義されているわけではないんですよね。外部にある領域に対してsetアクションで操作している、というほうがしっくりきます。

また、MVCとかで言うところのViewだけでなく、Modelについても、IORefなどを駆使してデータを渡していくことになるようです。

ここら辺の問題を解決してIOモナドが関わるレイヤーを減らして行きたいところです。