gpt4 book ai didi

scala - Scala 中的隐性证据是什么?到底有什么好处呢?

转载 作者:行者123 更新时间:2023-12-04 17:09:49 26 4
gpt4 key购买 nike

我在许多 SOF 和博客文章中看到术语“隐式证据”,与类型信息的运行时保留相关。我搜索了网络,但没有找到任何简单的解释“隐性证据”是什么。

这个概念就出现了,比如here .

编辑:

对特拉维斯的好回答的评论:

来自 Predef.scala :

  sealed abstract class <:<[-From, +To] extends (From => To) 
with Serializable

private[this] final val singleton_<:< =
new <:<[Any,Any] { def apply(x: Any): Any = x }

implicit def conforms[A]: A <:< A = singleton_<:<.asInstanceOf[A <:< A]

我不明白 unzip的“ asPair”函数参数可以从 singleton_<:<.asInstanceOf[A <:< A]导出.有人可以对此发表评论吗?

最佳答案

标准库中的一个很好的例子是 unzip 的定义例如List[A] :

def unzip[A1, A2](implicit asPair: (A) ⇒ (A1, A2)): (List[A1], List[A2])

目标是允许以下编译:
val (ks, vs) = List('a -> 1, 'b -> 2, 'c -> 3).unzip

但不是这个:
val (ks, vs) = List(1, 2, 3).unzip

这是通过一个隐式参数实现的,该参数证明列表的类型可以被视为一对。在上面的例子中,这个证据是由 Predef.conforms 提供的。 , 适用于任何类型 A将隐式提供 A <:< A 的实例,它是 A => A 的子类型. conforms提供的实例当然只是身份功能。

如果你看 the definition of unzip ,您将看到在这种情况下如何使用证据:
def unzip[A1, A2](implicit asPair: A => (A1, A2)): (CC[A1], CC[A2]) = {
val b1 = genericBuilder[A1]
val b2 = genericBuilder[A2]
for (xy <- sequential) {
val (x, y) = asPair(xy)
b1 += x
b2 += y
}
(b1.result, b2.result)
}

即,它用于解构序列中的项目。请记住,此方法定义在任何 List[A] 上。 ,所以写简单的旧 val (x, y) = xy不会编译。

隐性证据的其他应用可能有不同的目标(一些 quite complex)并且可能以不同的方式使用隐性证据(它不一定只是一个函数),但基本模式通常会或多或少与您相同见 unzip .

关于scala - Scala 中的隐性证据是什么?到底有什么好处呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21819156/

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