gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:43:34 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com