Getting a Good Grasp of F# (仮)

関数型言語F#をもっと楽しみたい

F# と Sodium でリアクティブ・プログラミング(1)

F# 向けのリアクティブ・ブログラミングには SodiumFRP.FSharp パッケージが利用できます。

Sodium においては、GUI のボタンクリックイベントやキーボードによるキー入力など何であれ、そういったイベント群をストリーム(Stream<'a>型)上に並べたデータ群として扱います。
SodiumFRP.FSharp では、イベント処理を、静的な F# のシーケンスリストに対する処理と同等に扱うコードが書けます。F# のパイプライン演算子も利用できるので便利です。

イベント処理結果の I/O 出力は、 Sodium ではストリームへ登録したリスナーから行います。

簡単な例として、キーボードから入力したキーコードが数字かアルファベットかを判定して、判定結果を文字列としてコンソールに出力するコードを書いてみます。(数字とアルファベット以外のキー入力は無視します。 Esc キーを押せばアプリケーションを終了します。)

f:id:pongitsune:20211006211318p:plain

ソースコード



6行目:イベント送信可能なストリームとしてStreamSink<ConsoleKeyInfo>を作成します。(StreamSink<'a>Stream<'a>の派生型です。)

7~16行目ConsoleKeyInfo型のデータのうち、数字とアルファベット入力だけを有効なイベントとして選抜し、イベントが運搬するデータ(ConsoleKeyInfo型)を表示用文字列(string型)に変換する新たなストリーム(Stream<'string>型)を作成します。

Stream<string option>に対する filterOptionalのフィルタ処理(16行目)ではNone以外の値を選抜し、string optionからstringへ型変換してイベントを通過させています。

18~20行目sStrOutput用のリスナー(IStrongListener型)を作成します。listenSで、イベントデータを受け取って処理する関数を登録します。(ここでは文字列をコンソール出力する関数を登録しています)

22~24行目:キー入力イベント群を表す無限長のシーケンス(ConsoleKeyInfo seq型)を作成しています。Escキー入力が来るまで無限にキー入力を受け入れます。

24行目sendS関数によってイベントを発生させてConsoleKeyInfo型のデータを送信しています。

26行目20行目sStrOutputへ登録したリスナーを登録解除します。

※ソースコードはGitHubで公開しています

 

●概念図

f:id:pongitsune:20211006223219p:plain

《参考資料》

関数型リアクティブプログラミング Functional Reactive Programming