22

在我阅读 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))

第一个参数列表似乎很简单CList[Int]书中解释了如何<:<通过方差强制类型约束。但我不太明白这对查找有什么帮助A

我的理解是,从第一个参数列表中,scala 找出C: List[Int],然后寻找implicit ev: <:<[List[Int], Traversable[A]]. 目前A仍是未知数。它“拉”了两个隐式conforms[List[Int]]conforms[Traversable[A]]匹配ev。在任何一种情况下,为了满足方差,List[Int] <: Traversable[A]都必须满足,这导致发现AInt

它像我在这里描述的那样工作吗?特别是关于如何/何时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 回答