2012-03-17 2 views
2

Possible Duplicate:
Why Option[T]?オプションのリファレンスタイプ

リファレンスタイプは「価値のない」を意味する特別な値nullを提供しています。値型にはそのような値はありません。そのため、C#ではオプションの値型が導入されています(特殊な構文もあります)。

ScalaのOption[T]には、3つの異なる「null」値:null,NoneおよびSome(null)があります。この複雑さが、安全性と表現力の面で私たちを買うのはどういうことでしょうか?いつ私はどちらを使うのですか?

+0

_ "これはC#がオプションの値型を導入した理由です" _これは理由ではありません。 – gdoron

+1

これは 'Option'がなぜ' null'よりも優れているのかを説明する最も良い説明の一つです:[Scalaの "Option"とHaskellの "Maybe"タイプがあなたをnullから救う理由](http://james-iry.blogspot.com /2010/08/why-scalas-and-haskells-types-will-save.html) – Jesper

答えて

5

グッドスカラは実際には1つのヌル値:Noneしか持っていません。 nullは使用しないでください(ただし、既存のJavaコードとの下位互換性を除く)。

なぜOption[T]が有用であるかに関する多くの回答があります。たとえば、thisを参照してください。

短いバージョン:

これはオプションの性質を明示的な署名にします。明らかに、以下のことは、我々はtは「ヌル」ことができることを期待すると述べている:

def f(t: Option[T]) 

あなたは操作の前にヌルチェックする必要はありません。正常に動作(i: Option[Int]) => i.map(_ + 1)iSome(5)またはNoneOptionを保持しているかどうか入力がNoneである可能性があることを示すラッパー(したがって、出力はNoneでもよい)。

あなたが他の Option Sまたはコレクションを簡単に構成することができます
def f(i: Option[Int]) = i.map(_ + 1) 
f(Some(5)) // Some(6) 
f(None) // None 

val a: Option[Int] = Some(1) 
val b: Option[Int] = Some(6) 
val c: Option[Int] = Some(5) 
val d: Option[Int] = None 
for(x <- a; y <- b; z <- c) yield x + y + z // Some(12) 
for(x <- a; y <- d; z <- c) yield x + y + z // None 
+0

答えを投稿してから3年が経過していることは分かっていますが、参考までに、私はScala 2.11.4 REPL: :11:エラー:タイプの不一致。 (x < - a; ** y < - b **; z < - c)は、x + y + zを返します。 –

+0

を修正しました。今コンパイルされます。 – dhg

1

C#では(と一般的には、.NET Frameworkで)ラッパーの一種であるタイプNullable<T>があります値型の場合

Nullable<int> i = null; 
if (i == null) ... 
if (i.HasValue) { int k = i.Value; ... } 

Nullable<T>のショートカットがあります:T?。一方

int? i = null; 

、オプションのパラメータがあります。これらのデフォルト値を定義する必要があります。彼らが欠けているかどうかを知る方法はありません。

関連する問題