7

だから私はツイッターのScalaスクールを通してScalaを学ぼうとしています。しかし、私は現在、それらの型にバインドされた例の1つで立ち往生しています。

特に、<%<型関係演算子を使用して、型が特定の型として表示できるようにバインドされているものです。

Scalaコンソールで次のコードを実行すると:

scala> class Container[A](value: A) { def addIt(implicit evidence: A <%< Int) = 123 + value }

...次のエラーが発生します。

<console>:7: error: not found: type <%<
       class Container[A](value: A) { def addIt(implicit evidence: A <%< Int) = 123 + value }
                                                                     ^
<console>:7: error: overloaded method value + with alternatives:
  (x: Double)Double <and>
  (x: Float)Float <and>
  (x: Long)Long <and>
  (x: Int)Int <and>
  (x: Char)Int <and>
  (x: Short)Int <and>
  (x: Byte)Int <and>
  (x: String)String
 cannot be applied to (A)
       class Container[A](value: A) { def addIt(implicit evidence: A <%< Int) = 123 + value }

私の質問は、Scalaインタープリターが不平を言っているのはなぜですか?

私はScalaのドキュメントを調べようとしましたが、そのオペレーターの情報をどこにも見つけることができませんでした。ScalaスクールはScala2.8.0に基づいて作成されており、Scala 2.10.0を実行していることがわかります。これは削除されたのでしょうか?これが事実である場合、それが有用な演算子のように見えるので、なぜこれはなぜですか?

4

3 に答える 3

8

Scala2.8の制約A <%< Bは次のように定義されています

  sealed abstract class <%<[-From, +To] extends (From => To)
  object <%< {
    implicit def conformsOrViewsAs[A <% B, B]: A <%< B = new (A <%< B) {def apply(x: A) = x}
  }

したがって、いつでもその方法で戻すことができます。ただし、非推奨になった理由は、ビューバウンドがからAへの暗黙の関数を要求しているだけBであり、その特定の制約を一般化された方法で表現するための完全に優れた方法があるためだと思います。

class Container[A](value: A) { def addIt(implicit evidence: A => Int) = 123 + value }

余談ですが、これは演算子ではなく、定義からわかるように、中置位置にあるクラスであることに注意してください。同じことが、型コンストラクター=>を参照する別の方法である、にも当てはまります。Function1

于 2013-02-20T15:43:47.200 に答える
2

このサイトでは、A <%< BScala2.9で非推奨になったと書かれています。理由はわかりませんが、私にとっても非常に便利な演算子のように見えるので、少し奇妙に思えることに同意します。

于 2013-02-20T15:38:06.157 に答える
-1

正しい使い方は

class Container[A](value: A) { def addIt[A <% Int] = 123 + value }

オーバーロードされた値に関してscalaは、あいまいさを解決しないことを選択しています。その場合、あなたは決定しなければなりません。

  • 次のコマンドでデバッグを試すことができます。-Xprint:typer

  • または、またはすでに提案されているのいずれかを使用して、それAが実際に行われていると判断できます。それらは同等です。しかし、ここであなたはそれが一種の;であると言っています。とは対照的に、どちらが何をしているのかを見ることができます。Intclass Container[A](value: A) { def addIt = 123 + value.asInstanceOf[Int] }class Container[A](value: A) { def addIt(implicit evidence: A => Int) = 123 + value }AIntAInt<%

その2番目のオプションは簡単ではありません。次のことを考慮してください

scala> class Container[A](value: A) { def printIt[A <% Int] = println( 123+" could be " + value) }
defined class Container

scala> val x = new Container("Love")
x: Container[String] = Container@21ebfd82

scala> x.printIt
123 could be Love

明らか"love"にタイプではないIntのでString、それでもこのコンテキストでは完全に問題ありません。そのため、の使用には注意が必要ですA => Int

于 2013-02-20T16:39:32.457 に答える