1

以下がバグなのか機能なのか疑問に思っています:

Welcome to Scala version 2.10.0-M3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0).
Type in expressions to have them evaluated.
Type :help for more information.

scala> class TypeClass[T]
defined class TypeClass

scala> trait A[T] {
     |   implicit val t = implicitly[TypeClass[T]]
     | }
<console>:9: error: could not find implicit value for parameter e: TypeClass[T]
         implicit val t = implicitly[TypeClass[T]]
                                    ^

予想どおり、 に制約がないため、これはコンパイルされませんT。しかし、型注釈を追加すると、コンパイルされます。

scala> trait A[T] {
     |   implicit val t: TypeClass[T] = implicitly[TypeClass[T]]
     | }
defined trait A

コンパイラはここで不平を言うべきではありませんか? 型注釈が違いを生むのはなぜですか? この特性で何かをインスタンス化すると、tis null.

4

2 に答える 2

5

実際、あなたはここで自分を傷つけているだけです。:-)

暗黙的TypeClass[T]がであることを宣言しましたval t。つまりval t = t、これにより null になります。痛い!

Tは抽象的であるため、コンパイラは を提供できませんTypeClassTパラメータでそれを取得する必要がありますが、 trait. でclass、作るT : TypeClass

于 2012-07-09T21:27:24.610 に答える
2

これはバグでも機能でもなく、いくつかの機能の結果に過ぎないと思います。

TypeClass[T]最初の例では、スコープ内に type の暗黙的な値はありません。の型を知るために型推論に依存します。tまた、暗黙の型はコンパイル時に解決tされるため、暗黙の値が見つからないため、の型は定義されません。

2 番目の例では、スコープ内に適切な暗黙の値、つまり がありtます。一般的にその動作を許可しない場合、次のような再帰的な定義を行うことはできません。

val fibs: Stream[Int] = 0 #:: 1 #:: fibs.zip(fibs.tail).map{case (x,y) => x+y}
于 2012-07-09T21:36:40.720 に答える