9.6 F# 1.0 -- 機能コアの改善:ファーストクラスのイベント
2021-09-25 00:00:21
初期のF# アプリケーションにはSPiMのようなシステム用のGUIプログラミングが含まれており、 必然的にF# はこれまでのML系言語の設計と比べて、リアクティブ、非同期、およびイベントベースのプログラミングに重点を置いていました。 .NETメタデータとC# には、「イベント」という組み込みの概念が含まれていました。 ただしこの概念は、次の2つの理由により、型付き関数型言語の設計に簡単にはなじみません。
- C# イベントは、直感的には何らかのライブラリーに属しているようですが、実際は言語と.NETメタデータに「組み込まれ」ています。
- C# イベントは、ファーストクラスの値として扱うことはできません。
F# オブジェクトシステムを設計する過程で – そしてそれを単純化して正規化するために – 「ファーストクラスのイベント」はF# 言語とライブラリーの拡張として設計され、2006年3月23日にリリースされました[Syme 2006b]1。 その目的は、.NETのイベントを、あたかもライブラリーで定義された値のような見た目と雰囲気にすることと、さらにファーストクラスのイベント値としてイベントの組み合わせを可能にすることです。 ファーストクラスイベントの代表的なコードサンプルは次のようなものでした。
let mouseMove =
form.MouseMove
|> Event.filter (fun e -> e.Button = MouseButtons.Left)
|> Event.filter (fun _ -> inputMenuItem.Checked)
ここで form.MouseMove
はハンドラーの登録と解除を可能にするファーストクラスのイベントです。
イベントの合成は、form.MouseMove
のトリガーをフィルタリングして、
マウスの左ボタンが押されて特定のメニュー項目がチェックされたときにのみ発生する新しいイベントを生成します。
こうして、イベントの合成、フィルタリング、組み合わせ、および変換という一般的なパターンを抽象化できるようになりました。
この機能の追加はWes Dyerに直接影響を与え、Erik MeijerによるReactive Extensions(Rx)プロジェクトの開始にもつながりました[Dyer 2009]。
イベントハンドラーを登録するとメモリーリークが発生することが予想されますが、
後に、F# プログラミングモデルのこの部分をRxのIObservable
型を使用するように変換することで対処されました、
このトピックはまた、PetricekとSymeによる、リアクティブシステムにおけるガベージコレクションをテーマにしたF# 関連の出版物にもつながりました[Petricek and Syme 2010]。
-
なお、F# のファーストクラスイベントの値は,1990年代にStandard MLに実装された並行プログラミングのフレームワークであるConcurrent MLの「イベント」の値とは直接関係ありません。 ↩︎