在阅读7.3.2捕获类型约束时会出现几个问题
来自Joshua's 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]
似乎很简单list 。本书还解释了
<:<
如何通过方差强制类型约束。但是我不太明白如何找到
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
。
最佳答案
作为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]
,但我们不针对该特定的隐式搜索。
关于scala - 隐式<:<如何帮助查找类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15998272/