2017-01-29 4 views
2

私は状態のリストを生成するF#プログラムを持っています。私はまた、画面に状態を表すグラフィックスを描画するためにGDI +を使用するWindowsフォームを持っています。ユーザーがフォーム内のボタンをクリックすると、次の状態が表示されます。 C#では、インデックスを保存し、これを使用してリストから次の状態を取得します。私は可変変数を作成してF#で同じことをすることができることは知っていますが、それは正しい方法のようには見えません。Fのイベントに反応するときに次の値を取得する

イベントが発生したときにリストから次の値を取得するために関数型プログラミングのパラダイムに適している方法はありますか?クリックイベントのための擬似コード:実際には

let clicked e = 
    let state = getNextState 
    render state 
+0

実際にボタンのクリックは、パネルが無効になり、塗料も次の状態の取得とレンダリングを行いますが、私は例のロジックを維持したいですシンプル。 – Jesse

+1

あなたは[Gjallarhorn](http://reedcopsey.github.io/Gjallarhorn/index.html)も探検してください。これはこの種のものには非常に適しています。 – s952163

答えて

4

は、私が変更可能な変数を使用すると、完全に罰金だと思い - 現在の状態を維持するために、単一の可変変数を使用しては、F#ではかなり一般的なパターンです。

つまり、Event.scan機能を使用してロジックをエンコードできます。この関数は状態を保持し、イベントが発生するたびに新しい状態を計算させます。ここでは、クリックするたびにインクリメントされますその上に番号の付いたボタンを作成し、これを使用して、最小限のデモです:あなたの例のように

let frm = Form(Visible=true) 
let btn = Button(Text="Click") 
frm.Controls.Add(btn) 

は、我々は次の状態を計算するためのいくつかの初期状態、機能を持っており、現在の状態に基づいてGUIを更新機能:

let initialState = 0 
let nextState state = state + 1 
let updateForm state = btn.Text <- string state 

今、あなたのクリックで以前の状態にnextStateを適用して算出された「現在の状態」を含む新しいイベントを作成するためにEvent.scanを使用することができます。 Event.addを使用して、我々はその後、時に状態変化updateFormを呼び出す:

btn.Click 
|> Event.scan (fun oldState event -> nextState oldState) initialState 
|> Event.add (fun state -> updateForm state) 
関連する問題