Oderskey と Venners の標準的な「Programming in Scala」から:
scala> val results = List(Some("apple"), None,
Some("orange"))
results: List[Option[java.lang.String]] = List(Some(apple),
None, Some(orange))
scala> for (Some(fruit) <- results) println(fruit)
apple
orange
Some(apple) を推論するのではなく、明示的に言及する必要性をプログラマーに課すという scala の哲学を私は理解していません。私は次のことを書いたり見たりしたいと思います:
scala> val results = List("apple", None, "orange")
results: List[Option[java.lang.String]] = List(apple, None, orange)
scala> for (fruit <- results) println(fruit)
apple
orange
または、少なくとも次のことを行う必要があります (個々のアイテム レベルではなく、リスト レベルでの入力を提供します)。
scala> val results :List[Option[String]] = ("apple", None, "orange")
results: List[Option[java.lang.String]] = List(apple, None, orange)
scala> for (fruit <- results) println(fruit)
apple
orange
少なくともこの最後のケースでは、List の型が提供されています (コンパイラを支援するため..) が、Some('foo') のように List 内のすべての要素を「ボックス化」する冗長性を回避します。
scala の考え方に詳しい人なら誰でも、なぜ私がその余分なタイピングをしなければならないのか教えてくれるでしょう.. ?
編集:次は、文字列に必要なことを行います。
scala> implicit def toOpt(a : String) = Some(a)
toOpt: (a: String)Some[String]
scala> val myList : List[Option[String]] = List("first", None, "third")
myList: List[Option[String]] = List(Some(first), None, Some(third))
誰かがより高い種類の型を使用して上記を一般化する方法を示すことができれば、私は答えを授与します.