前回のoption型のエントリを書いたら速攻で@bleisさんからTwitterで突っ込みが入りました。
こういう、突っ込みってうれしいものですよね。option型の説明について補足です。
C#などでの参照型が戻り値となるようなメソッドの場合は、シグネチャを見ただけではnullになるのかどうかが判断することができません。
たとえば以下のようなC#のメソッドの場合、戻り値のButtonにnullがあるのかどうかということはわかりません。おそらくドキュメントに記載されるかCode Contract?あたりで補足情報が追加されるのでしょう。
public Button FindButton(string id) { // 実装は秘密 }
もし、ドキュメントとかに何も記載がなかった場合は、ドキドキしながら本当は不要なnullチェックを入れることになると思います。
F#のoption型の場合どうでしょうか
let FindButton(id : string) : Button option
シグネチャを見ただけで、戻り値がNoneかSomeかのどちらかであることが明示されているので、使う人は安心してNoneかどうかのチェックを入れて使えます。
関数の内部実装をする人が、ちょっと悪い人でnullを無理やり返そうと以下のような実装をしたとしてもNoneが返るという徹底ぶりです。
defaultofは指定された型のデフォルト値(参照型の場合はnull)を返す関数 Unchecked.defaultof<Button option>
ということで、option型は参照型をそのまま返すよりも関数の戻り値を明示できるという点において安全ということでした。
以上、補足でした。
過去記事
- 手軽なスクリプト言語としてのF#
- 手軽なスクリプト言語としてのF# その2
- 手軽なスクリプト言語としてのF# その3
- 手軽なスクリプト言語としてのF# その4
- 手軽なスクリプト言語としてのF# その5
- 手軽なスクリプト言語としてのF# その6
- 手軽なスクリプト言語としてのF# その7
- 手軽なスクリプト言語としてのF# その8「レコード」
- 手軽なスクリプト言語としてのF# その9「クラス」
- 手軽なスクリプト言語としてのF# その10「継承・アブストラクトクラス」
- 手軽なスクリプト言語としてのF# その11「インターフェースと演算子のオーバーロード」
- 手軽なスクリプト言語としてのF# その12「ラムダ式とイベント」
- 手軽なスクリプト言語としてのF# その13「オブジェクト初期化子みたいなの」
- 手軽なスクリプト言語としてのF# その14「合成演算子とパイプ演算子」
- 手軽なスクリプト言語としてのF# その15「WPFしてみた」
- 手軽なスクリプト言語としてのF# その16「総称型 ジェネリック」
- 手軽なスクリプト言語としてのF# その17「リスト」
- 手軽なスクリプト言語としてのF# その18「オプション型」