かずきのBlog@hatena

日本マイクロソフトに勤めています。このブログは個人ブログなので、ここに書いている内容は個人的な意見で会社の公式見解ではない点にご注意ください。好きなものは XAML と C# 。苦手なものは型の無い言語です。

手軽なスクリプト言語としてのF# その12「ラムダ式とイベント」

そろそろ、過去のエントリのリストが長くなってきたので、後ろにつけることにしました。さて、今日はC#でお馴染みラムダ式とイベントをやってみようと思います。

ラムダ式

ラムダ式の定義は簡単です。

fun 引数 -> 関数本体

試しに足し算する関数をラムダ式で書いてみましょう。

// 足し算するラムダ式をaddに代入
let add = (fun x y -> x + y)

// 呼び出し可能
printfn "%d" (add 1 10)

// もちろん変数に入れてなくてもその場で呼び出せる
printfn "%d" ((fun x y -> x + y) 5 10)

非常にすっきり書けるので、短い処理なんかで再利用しないやつには使っていけばいいと思います。

イベント

イベントについては、前にやったEventクラスを使ってやります。コツは、C#とかからきちんとイベントだということがわかるように[]の属性をつけるところ以外は依然やったのと同じ感覚でいけます。

それでは、何かしらが変更があったことを外部に伝えるイベントを定義して、それをキックするメソッドを持つクラスを作ってみます。

// EventArgsのため
open System

type Sample() =
    // イベントの元 なんとジェネリックのパラメータに_を入れると
    // コンパイラが空気を呼んで適切な型にしてくれる。
    // ここだとOnChangedのTriggerでEventArgs型だということがわかる
    let changed = Event<_>()

    // CLIEvent属性をつけて公開するとC#からも使える
    [<CLIEvent>]
    member this.Changed = changed.Publish

    // イベント発生のトリガ
    member this.OnChanged() = changed.Trigger(EventArgs.Empty)

let s = Sample()
// イベントハンドラの登録はAddメソッドで行う
s.Changed.Add (fun e -> printfn "イベント発行")
// イベント実行!
s.OnChanged();

前にEventモジュールの使い方はやったので説明はしませんが、F#が空気読み過ぎで型推論してくれる凄い一面を垣間見てしまいました。実行結果は以下のようになります。

イベント発行

きちんとイベントが発行されています。めでたしめでたし。