在我阅读 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
推断。