我在阅读7.3.2捕获类型约束时出现了几个问题 来自Joshua的Scala in Depth。摘自本书的例子:
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))
第一个参数发现C
List[Int]
似乎很简单
名单。本书解释了<:<
如何通过方差强制执行类型约束。
但我不太明白这有助于找到A
。
我的理解是,从第一个参数列表中,scala找到C: List[Int]
,
然后它会查找implicit ev: <:<[List[Int], Traversable[A]]
。
目前A
仍然未知。
它“拉”了两个含义conforms[List[Int]]
和conforms[Traversable[A]]
匹配ev
。在任何一种情况下,为了满足方差,必须满足List[Int] <: Traversable[A]
,这导致发现A
是Int
。
它是否像我在这里描述的那样有效?特别是关于推导A
的方式/时间。
答案 0 :(得分:3)
作为pedrofurla commented,你已经做对了 - 只有一点资格。你说编译器“拉”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]
,但我们不会进行特定的隐式搜索。