隐式<:<help如何查找类型参数

cfc*_*hou 22 scala implicit

在我阅读时会出现几个问题.3.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))
Run Code Online (Sandbox Code Playgroud)

通过第一个参数列表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推断.

Tra*_*own 3

正如pedrofurla 评论的那样,你已经说对了\xe2\x80\x94,但有一点限定。您说编译器“拉动” conforms[Traversable[A]],但这里实际上不需要任何此类实例。举一个简化的例子,范围内的隐含内容非常清楚:

\n\n
trait Foo[-From, +To]\n\nimplicit object intListFoo extends Foo[List[Int], List[Int]]\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在肯定没有了Foo[Traversable[Int], Traversable[Int]],但我们可以写以下内容:

\n\n
scala> implicitly[Foo[List[Int], Traversable[Int]]]\nres0: Foo[List[Int],Traversable[Int]] = intListFoo$@8e760f2\n
Run Code Online (Sandbox Code Playgroud)\n\n

您的示例中或多或少发生了完全相同的事情。在这种情况下,如果需要的话,我们会有一个实例Traversable[Int] <:< Traversable[Int],但我们不需要特定的隐式搜索。

\n