かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

手軽なスクリプト言語としてのF# その19「参照型よりオプション型って安全?」

前回の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型は参照型をそのまま返すよりも関数の戻り値を明示できるという点において安全ということでした。
以上、補足でした。