Tambourine作業メモ

主にスキル習得のためにやった作業のメモ。他人には基本的に無用のものです。

F#で遊んでみる(11)

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がついてないとダメ)

このへんが適切に設計されているのかどうかは、型理論に明るくないのでさっぱりわからない。まあ、いいか。