1

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))

誰かがより高い種類の型を使用して上記を一般化する方法を示すことができれば、私は答えを授与します.

4

5 に答える 5

4

私が失礼だとは思わないでください。答えは、コンパイラはあなたの願いを推測することを意図した魔術師ではないからです

ボイラープレート(型推論、暗黙の変換)がある場合に役立ちますが、コンパイラの全体的なポイント(少なくとも型システムを備えた言語の場合)は、次のようなあいまいな状況をキャッチすることです

val results :List[Option[String]] = ("apple", None, "orange")

と怒鳴るやあおい、何か悪いことをしているに違いない!. あなたは基本的に、なぜコンパイラが犬を猫に、オレンジをリンゴに、またはトリックソーターゲームに割り当てることを許可しないのか、そして言語がそのようなトリックを許可すると、いくつかの非常に悪い厄介なことが起こる.

for (fruit <- results) println(fruit)

オプション自体ではなく、基礎となるボックス化されていない値を出力したいことを言語はどのように知る必要がありますか? 他の機能を使用する場合はどうすればよいですか?私が持っている場合はどうなりOption[Option[String]]ますか?おわかりのように、考慮すべきことがたくさんあります。この特定のケースで余分なタイピングが実際の問題であると本当に見なす場合は、座ってそれらすべてのケースを大きな本に列挙し、全員がそれをチェックして、考えられるすべての結果を理解する必要があります。コードは予測不能です。また、隠れたパフォーマンス シンクがあることにも注意してください。たとえば、コンパイラはあるコレクションを別のコレクションに暗黙的に変換します。それらは結局のところ、異なるクラスと異なる構造であり、驚くべきことです。どこにあるのかわかりません。少なくとも、コードを余分に見なくても構いません。結局のところ、なぜあなたは期待しないのですか

val i: List[Int] = 3

有効ですか?

于 2013-10-15T13:19:41.297 に答える
2

私はこれを支持しませんが、あなたが探しているように見えるのはこれです:

scala> implicit def aToOptionA[T](a:T):Option[T]=Some(a)
warning: there were 1 feature warning(s); re-run with -feature for details
aToOptionA: [T](a: T)Option[T]

scala> val  myList : List[Option[String]] = List("first", None, "third")
myList: List[Option[String]] = List(Some(first), None, Some(third))

scala> val  myList2:List[Option[Int]]  = List(1, None, 2)
myList2: List[Option[Int]] = List(Some(1), None, Some(2))
于 2013-10-15T20:32:36.183 に答える