scala - 隐式<:<如何帮助查找类型参数

标签 scala implicit

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

通过第一个参数发现CList[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],这导致发现AInt

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

相关文章:

scala - 为什么这个 Scala 方法的显式调用允许它被隐式解析?

multithreading - 在多线程环境中包含可变变量的隐式类

scala - 如何在 IntelliJ IDEA 中为 Spark 应用程序设置日志记录级别?

scala - 除了 Option 之外,标准的 Scala monad 是什么?

scala - 在列表上使用 .view 时出现奇怪的异常

scala - 为什么 Int 不从 Ordered[Int] 继承/扩展

ASP.NET:显式与隐式本地化?

scala - 为所有 Traversable 丰富我的图书馆

scala - 如何将 Set[Tuple2] 中的数据转换为案例类

斯卡拉 :Out of memory during building Breeze