かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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