隐含<:<帮助查找类型参数

时间:2013-04-14 10:55:18

标签: scala implicit

我在阅读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],这导致发现AInt

它是否像我在这里描述的那样有效?特别是关于推导A的方式/时间。

1 个答案:

答案 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],但我们不会进行特定的隐式搜索。