22

Joshua の Scala in Depth から 7.3.2 Capturing type Constraints を読んでいると、いくつかの疑問が生じます。本から抜粋した例:

scala> def peek[C, A](col: C)(implicit ev: C <:< Traversable[A]) = (col.head, col)
peek: [C, A](col: C)(implicit ev: <:<[C,Traversable[A]])(A, C)

scala> peek(List(1, 2, 3))
res9: (Int, List[Int]) = (1,List(1, 2, 3))

第 1 パラメーター リストCでわかるのは簡単なようです。また、バリアンスによる型制約をList[Int]どのように強制するかについては、本で説明されています。<:<しかし、それが を見つけるのにどのように役立つかはよくわかりませんA

私の理解では、最初のパラメーター リストから、scala は を見つけC: List[Int]、次に を探しimplicit ev: <:<[List[Int], Traversable[A]]ます。現時点でAは不明のままです。conforms[List[Int]]2 つの暗黙の とを「プル」conforms[Traversable[A]]して一致させevます。どちらの場合でも、分散を満たすにList[Int] <: Traversable[A]は、 を満たす必要があり、これにより、 という結果が得られAますInt

ここで説明しているように機能しますか?特にどのように/いつA推定されるかについて。

4

1 に答える 1

3

pedrofurla がコメントしたように、あなたはそれを正しく理解しています。コンパイラが「プル」すると言いますが、conforms[Traversable[A]]ここではそのようなインスタンスは必要ありません。どの暗黙がスコープ内にあるかが非常に明確な単純化された例を挙げると、次のようになります。

trait Foo[-From, +To]

implicit object intListFoo extends Foo[List[Int], List[Int]]

今は間違いなくFoo[Traversable[Int], Traversable[Int]]周りにありませんが、次のように書くことができます:

scala> implicitly[Foo[List[Int], Traversable[Int]]]
res0: Foo[List[Int],Traversable[Int]] = intListFoo$@8e760f2

あなたの例では、多かれ少なかれまったく同じことが起こっています。その場合、必要に応じてインスタンスTraversable[Int] <:< Traversable[Int]を用意しますが、その特定の暗黙的な検索は行いません。

于 2013-08-11T00:17:12.230 に答える