在我阅读 7.3.2 从 Joshua 的 Scala 中深度捕获类型约束时出现了几个问题。摘自书中的例子:
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推断。