gpt4 book ai didi

Scala 类型证据

转载 作者:行者123 更新时间:2023-12-03 23:08:37 26 4
gpt4 key购买 nike

在 scala 源代码中我可以看到这段代码:

@implicitNotFound(msg = "Cannot prove that ${From} <:< ${To}.")
sealed abstract class <:<[-From, +To] extends (From => To) with Serializable
private[this] final val singleton_<:< = new <:<[Any,Any] { def apply(x: Any): Any = x }
// not in the <:< companion object because it is also
// intended to subsume identity (which is no longer implicit)
implicit def conforms[A]: A <:< A = singleton_<:<.asInstanceOf[A <:< A]

@implicitNotFound(msg = "Cannot prove that ${From} =:= ${To}.")
sealed abstract class =:=[From, To] extends (From => To) with Serializable
private[this] final val singleton_=:= = new =:=[Any,Any] { def apply(x: Any): Any = x }
object =:= {
implicit def tpEquals[A]: A =:= A = singleton_=:=.asInstanceOf[A =:= A]
}

我不是很清楚为什么这两个类都扩展Function1。扩展任何东西都不够吗?

最佳答案

大多数时候你想确保 A <:< B (或者更准确地说,你想确保 A <: B 使用 A <:< B 类型的证据),这是因为你实际上有一个 A 类型的值并希望能够将其视为 B 类型的实例.

当你有一个值 x: A ,通过隐式值的存在证明 AB 的子类型不会神奇地改变 x 的类型至 B .

但出于所有意图和目的<:<实际上允许这样做,因为它也是一个只返回其参数的函数(它基本上是身份,只是添加了 - 并且稍微隐藏了 - 强制转换)。这样,当您的方法传递一个类型为 A <:< B 的隐式值时,你得到的实际上也是一个合适的隐式转换 AB (将 x:A 隐式转换为 B 类型的值)。

如果您实际上不需要转换任何东西,那么 <:< 是否真的无关紧要。延伸Function1还是不是。

同样的道理适用于 =:= .

更新:响应“在 =:= 的情况下,为什么我要将类型 A 的值转换为类型 A 的值?”:

您首先应该注意,即使在 <:< 的情况下也是如此有同样明显的矛盾:当然如果A <: B我可以处理 A 类型的任何值作为 B 类型的值(这几乎就是子类型的定义)。假设我们有以下通用方法:

class Foo { 
def hello() { println("hello!") }
}
def f[T]( value: T )(implicit e: T <:< Foo){
value.hello()
}
class Bar extends Foo
f( new Bar )

编译时f编译器只知道 value有某种类型 T .没有任何信息告诉编译器 T将始终是 Foo 的子类型.所以如果不是因为 e: T <:< Foo还提供了从 T 的隐式转换至 Foo ,然后调用value.hello()会失败,因为 T只是编译器不知道的某种类型任何事。只有通过精心设计,才有一个隐式值 e: T <:< Foo在范围内发生当且仅当 T <: Foo .但是编译器对此一无所知,所以从他的角度来看TFoo是无关的。因此我们必须给他提供一种方法来转换类型为T的值。至 Foo ,这是由 T <:< Foo 完成的证据本身。

正如我所说,同样的理由适用于 =:= : 有一个 T =:= Foo 的实例没有向编译器提供有关事实的任何线索那T = Foo ,所以转换必须提供给他。

关于Scala 类型证据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21306623/

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