Scala 类型证据

2023-12-01

在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,通过隐含值的存在证明A是一个子类型B不会神奇地改变类型x to B.

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

如果您实际上不需要转换任何内容,那么这并不重要<:<延伸Function1 or not.

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

UPDATE:响应“在 =:= 的情况下,为什么我要将 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 to Foo, 然后打电话value.hello()会失败,因为T只是编译器不知道的某种类型 任何关于. 只有经过精心设计,才具有隐含的价值e: T <:< Foo在范围内发生当且仅当T <: Foo。 但编译器不知道这一点,所以从他的角度来看T and Foo是无关的。 因此我们必须为他提供一种转换类型值的方法T to Foo,这是由T <:< Foo证据本身。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala 类型证据 的相关文章

随机推荐

  • 从 Android Activity 类调用 Javascript 函数

    我正在开发需要使用参数调用 Javascript 函数的应用程序 为了演示 我在这里写了我的 Activity 代码 我想从中调用 js 函数 主要活动 WebView wView FloatingActionButton fab Cont
  • 按键将对象分组为二维数组

    我有一系列对象 这些对象有一个属性称为time 如果这些对象的时间相同 我想将它们分组到同一个数组中 00 00 id 1 time 00 05 id 1 time 00 15 id 1 time 00 20 id 2 time 00 05
  • 批量复制特定文件到子文件夹中

    我有一个 Windows 批处理文件 正在运行该文件以将特定文件移动到子文件夹中 ECHO OFF ECHO Start Copy setlocal enabledelayedexpansion set SOURCE DIR C Users
  • 将数组插入 PHP 文件

    这可能非常愚蠢 但我们还无法做到这一点 我们正在尝试将数组插入到 php 文件中 然而 我们可以将数组插入到 php 文件中 但格式不符合要求 我们有 2 个文件 文件1 php
  • 获取Flask应用程序的根路径

    我正在开发一个 Flask 扩展 我想在文件系统上的项目根路径中创建一个目录 假设我们有这样的目录结构 project app tests my folder manage py my folder 应该由扩展动态创建 它是一个测试实用程序
  • 为什么 findViewById() 在这里不能像 getActivity().findViewById() 一样工作?

    A placeholder fragment containing a simple view public static class PlaceholderFragment extends Fragment public Placehol
  • 如何控制用户输入的地址显示404

    我想在用户输入未知地址时显示 404 页面 如上图所示 之后我可以控制未知地址index php但不知道如何在之前的部分执行此操作index php part 我编写这段代码是为了控制用户输入的内容index php 看起来你的开发机器上有
  • 支持 DOM 样式访问的 Java JSON 库

    我正在用 Java 编写一个 JSON 风格的查询引擎 它将受益于通过 DOM 路径查询 JSON 文档的能力 就像在 Javascript 中所做的那样 我检查过 GSON 和 Jackson 但似乎都不支持这一点 除了我自己的之外 有人
  • Microsoft graph API:无法使用生成的访问令牌获取用户

    我已在 Azure 门户中注册了该应用程序 并生成了 client secret 我需要客户端授权流程 并且我也授予了应用程序权限 我也已授予管理员同意 因为我自己就是管理员 我可以使用给定的 url 生成访问令牌 https login
  • Rails:找不到railties

    rvm v rvm 1 10 2 by Wayne E Seguin lt email protected gt Michal Papis lt email protected gt https rvm beginrescueend com
  • C++的recv()问题

    我想发送一个字符串 Hello there 但我只收到 re 这是为什么 void Accept SOCKADDR IN sock int intsock sizeof sock remoteSocket accept desc LPSOC
  • Vuejs 3如何将变量传递给槽内的所有元素

    我正在使用 VueJs 3 创建一个动态表组件 其中涉及将循环索引变量发送到插槽内的所有子组件 组件的用法如下
  • 无法加载从带有标识符的包中的笔尖引用的图像

    如果需要复制项目 gt 完成 区分大小写 gt 已注意 图像位于项目文件夹内 这里可能有什么问题 Xcode 版本 9 0 我通过将图像导入资产 Assets xcassets 并从那里引用它来解决这个问题 看起来 Xcode 9 中的构建
  • 如何切换浏览器操作的操作?

    我已经创建了我的第一个 chrome 扩展 它将事件处理程序添加到单击时页面上的所有锚元素 如果用户第二次单击该图标 事件处理程序将重新附加到锚元素并执行两次 我需要以下内容 单击浏览器操作 将事件添加到锚元素 如果可能 请在浏览器操作图标
  • 时间:2019-03-17 标签:c#webrequestpostimagetowebapi

    我在将图像上传到我正在运行的 Web API 时遇到问题 使用 GET 请求时 我可以从 Web API 检索数据 但在处理 POST 请求时遇到问题 我需要将 BMP 图像上传到 Web API 然后发回 json 字符串 HttpPos
  • 如何使用 Google Chrome 扩展更改所选文本的 CSS

    我正在为 Chrome 浏览器制作一个扩展 它使用 contextMenus 来更改所选文本的 CSS 但我无法访问 HTML 结构 即所选文本的父节点 就像在本示例中可以轻松做到的那样 var selection window getSe
  • Instagram ?__a=1 url 不再工作 & graphql/query 获取数据的问题

    4 月 19 日更新 使用cookie几天后ig pr前两天是块 看起来现在获取数据的唯一方法是使用sessionid具有特定值 Original 我正在使用 instagram a 1 url 来阅读 Instagram 用户的所有帖子
  • MySQL:将大表拆分为小表的最快方法

    我有一个非常大的表 其中有近 3 亿条记录 由于 select 查询对我来说太慢了 所以我想将其拆分为大约 800 个小表 数据集如下所示 XXXXXX column2 column3 column4 XXXXXX column2 colu
  • max 的匿名/Lambda 函数

    我正在尝试编写一个单行函数 您可以在其中输入一个数字和一个列表 然后它返回最高值 例如 Input getMax 5 1 4 7 Output 7 这是我当前的代码 getMax Ord a gt a gt a gt a getMax f
  • Scala 类型证据

    在scala源代码中我可以看到这段代码 implicitNotFound msg Cannot prove that From lt lt To sealed abstract class lt lt From To extends Fro