8.15のアクティブパターンから
これまでのパターンマッチングでレコードやタプルにマッチさせるパターンが存在したけど、自分で定義したクラスにはあらかじめ定義されたパターンは存在しない。なので自分で定義する。これをアクティブパターンという。
アクティブパターンとは
- 関数である
(| ... |)
の形でパターンを定義する。バナナクリップと呼ぶらしい- 引数がパターンマッチさせる対象の値で、引数の型に対して、網羅的なパターンである
- マッチしたパターンごとに値を返すことが出来る
- Choice型を返す
- バナナクリップ付きで関数として実行可能
- マッチに失敗するパターンは
(|パターン|_|)
と記述する。この場合、optionを返す
面白い。
8.16は、構造体。構造体は、スタックに確保されるユーザー定義型のこと。クラスと同じ構文だけど、属性としてStructを指定する。まあ、使うことは普通はないよね。
その次、8.17はデリゲートについて。ここは例えばGroovyとJavaと同じように、F#のラムダ式をC#のデリゲートに変換するような仕組みがある。C#との互換のためにF#にもデリゲートを定義する構文はあるけど、使わないと思うので割愛。
8.18に列挙型。F#には判別共用体があるけど、それと別にC#のEnumを扱うための構文がある・・・がなんでもtypeなんでこれがC#にいくとEnumになるというのは見てわかる自信がない。まあ、割愛。
8.19は型拡張。これも今は割愛。名前からしてC#のExtensionかと思ったら互換性ないらしい。あらら。
8.20は演算子オーバーロード。うーん、まあF#側でわざわざこれはやらないかな。というか、この辺は欲しくなったらC#で書いて組み合わせて使えば良い気がする。
8.21はジェネリック制約。以下が出てくるけど、こういうものがあるということだけ覚えておいて、これを使う必要があるものを作っちゃったら読み直そう。
- フレキシブル型
- コンストラクター制約
- null制約
- 値型制約、参照型制約
- 列挙型制約、デリゲート制約
- 明示的メンバー制約(inlineがついてないとダメ)
このへんが適切に設計されているのかどうかは、型理論に明るくないのでさっぱりわからない。まあ、いいか。