Scala“<-”用于理解

2023-11-27

我发现 Scala 总是对任何事情都有“自然的解释”。总是类似“哦,但这只是用这个和那个参数在这个和那个对象上调用的函数”。从某种意义上说,没有什么是真正像我们从其他语言中了解到的那样具有编译器魔力。

我的问题是关于<-运算符如以下代码中所使用:

for(i <- 0 to 10) println(i)

在这个例子中,我可以看到它被重写为:

0.to(10).foreach((i:Int)=>println(i))

但这并不能解释如何i被带入 foreach 函数内的匿名函数中。在你写的地方i它不是一个对象,也不是一个声明的变量。那么它是什么?它是如何被转移到 foreach 内部的?

我的猜测是我终于发现了一些事实上的东西编译器魔法

谢谢你的时间。

澄清,我的问题是:


为了补充 Dave 的答案,这里有一个来自 Scala 语言规范的“for-commplions”的翻译模式:

一个领悟for (enums) yield e评估表达式e对于枚举器 enums 生成的每个绑定。枚举器序列总是以生成器开始;接下来可以是进一步的生成器、值定义或防护。

发电机一台p <- e从表达式生成绑定e它以某种方式与模式匹配p。值定义val p = e绑定值名称p(或模式中的多个名称p) 计算表达式的结果e。一名警卫if e包含一个限制枚举绑定的布尔表达式。

生成器和守卫的精确含义是通过转换为调用来定义的 四种方法:map, filter, flatMap, and foreach。对于不同的运营商类型,可以以不同的方式实施这些方法。

翻译方案如下。第一步,每个生成器p <- e,其中 p 对于以下类型不是无可辩驳的(第 8.1 节)e被替换为

 p <- e.filter { case p => true; case _ => false }

然后,重复应用以下规则,直到所有理解都已完成 被淘汰。

  • 一个用于理解for (p <- e) yield e0被翻译成e.map { case p => e0 }.

  • 一个用于理解for (p <- e) e0被翻译成e.foreach { case p => e0 }.

  • 一个用于理解for (p <- e; p0 <- e0 . . .) yield e00, 在哪里 。 。 。是生成器或守卫的(可能为空)序列,被翻译 到:
    e.flatMap { case p => for (p0 <- e0 . . .) yield e00 }.

  • 一个用于理解for (p <- e; p0 <- e0 . . .) e00在哪里 。 。 。是一个(可能是空的)生成器或守卫序列,被翻译为:
    e.foreach { case p => for (p0 <- e0 . . .) e00 } .

  • 发电机一台p <- e后面跟着一名警卫if g被转换为单个生成器:
    p <- e.filter((x1, . . . , xn) => g )
    where x1, . 。 。 ,xn是自由变量 的p.

  • 发电机一台p <- e接下来是值定义val p0 = e0已翻译 到以下值对生成器,其中x and x0都是新鲜的名字:

    val (p, p0) <- 
      for(x@p <- e) yield { val x0@p0 = e0; (x, x0) }
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala“<-”用于理解 的相关文章

随机推荐

  • C++中使用ifstream逐行读取文件

    file txt的内容是 5 3 6 4 7 1 10 5 11 6 12 3 12 4 Where 5 3是一个坐标对 如何在 C 中逐行处理这些数据 我能够获取第一行 但如何获取文件的下一行 ifstream myfile myfile
  • 无法将 PySide 与 Anaconda 一起使用

    我刚刚安装了 Anaconda for Python 3 然后安装了 PySide sudo apt get install python3 pyside 然后我尝试使用它抛出 Anaconda 的 python 版本并输入import P
  • 如何将 int[] 转换为 byte[]

    我有一个代表 RGB 图像的整数数组 希望将其转换为字节数组并将其保存到文件中 在 Java 中将整数数组转换为字节数组的最佳方法是什么 As Brian说 你需要弄清楚你需要什么样的转换 您想将其保存为 普通 图像文件 jpg png 等
  • OpenCV:了解内核

    我的书谈到了 OpenCV 中的图像内核概念 当计算在像素邻域上完成时 通常 用核矩阵表示它 该内核描述了如何 将参与计算的像素组合起来以获得 期望的结果 在图像模糊技术中 我们使用内核大小 cv GaussianBlur inputIma
  • C++ 中高效的线程安全单例

    单例类的通常模式是这样的 static Foo getInst static Foo inst NULL if inst NULL inst new Foo return inst 但是 据我了解 此解决方案不是线程安全的 因为 1 Foo
  • 在自托管 WebApi 中获取 HttpRequest 上下文

    如何从自托管 MVC WebAPI 访问查询字符串 对以下内容的调用因 NRE 失败 因为 Current 为空 又名 null System Web HttpContext Current Request myQuery 我需要访问控制器
  • 使用 boost::asio 的 AF_NETLINK (netlink) 套接字

    我正在编写基于的多播客户端 服务器应用程序this and this 效果很好 但是 当计算机中的活动网络接口数量发生变化时 我还需要执行一些操作 例如示例部分中的程序这一页 does 我想我应该使用 boost asio local 中的
  • 在 Windows 服务中运行 cdb 时无法下载 microsoft 符号

    我有一个 NET窗口服务那是在呼唤cdb exe分析故障转储 我想从以下位置下载符号http msdl microsoft com需要时自动使用参数 y srv c symbols http msdl microsoft com downl
  • Python 文件到 MSI Windows 安装程序

    因此 我可以使用 PyInstaller 制作一个单文件可执行文件 并在文件夹中的其他文件中制作标准可执行文件 但是如何将 Python 文件转换为 MSI 安装程序 以便万无一失地在桌面上创建快捷方式呢 用于分发 以便用户不需要安装Pyt
  • Excel进程未关闭[重复]

    这个问题在这里已经有答案了 我有这个 C 程序 它永远不会关闭 Excel 进程 基本上 它会查找某个字符串在 Excel 中某个范围内出现的实例数 我尝试了各种方法 但没有效果 有一个表单正在调用此方法 但这不会改变进程未关闭的原因 我看
  • JQuery / JS:检测用户的滚动尝试,没有任何窗口溢出滚动到

    我正在开发一个过渡网站 虽然我想使用用户的滚动尝试作为过渡启动器 但我不希望有窗口滚动条 现在 我只是用 jquery 检测用户滚动 我已经将窗口大小设置为比用户屏幕的滚动条高 1px 尽管这是我试图避免的 scroll function
  • [Android]NumberPicker 选中项改变颜色

    是否可以更改 numberpicker 中所选项目的颜色 以便每次出现新的中心子 TextView 时将其颜色更改为我喜欢的颜色 但我没有找到任何与此相关的样式或 API 公开 I tried to follow many answers
  • 更改 Chrome 4xx 页面

    我正在部署一个信息亭系统 该系统使用 Chrome 来显示在 jetty 中运行的 java web 应用程序 该应用程序以 Windows 服务包装器启动 系统启动后需要一些时间才能让 jetty 准备好提供内容 因此现在我需要等待 然后
  • 如何按照声明的顺序读取类属性?

    我正在编写一个读取类属性并将它们存储在列表中的元类 但我希望列表 cls columns 尊重声明顺序 即 mycol2 mycol3 zut cool menfin a在我的例子中 import inspect import pprint
  • ActiveMQ Jolokia API 如何获取完整的消息正文

    我想编写自己的 ActiveMQ 监视器 我可以从队列中获取队列和消息 但消息正文 内容 很短 如何获得完整的消息正文 这个我已经测试过了 Get Always errors http localhost 8161 api jolokia
  • 按行数拆分数据框

    我有一个由 400 000 行和大约 50 列组成的数据框 由于这个数据帧太大 处理起来计算量太大 我想将此数据帧分割成更小的数据帧 然后运行我想要运行的函数 然后最后重新组装数据帧 我没有想用来分割此数据框的分组变量 我只想按行数将其拆分
  • Rails/ActiveRecord:将更改保存到模型的关联集合

    我是否必须保存对模型集合中各个项目的修改 或者是否可以在保存模型时调用一种方法来保存它们 save似乎没有这样做 例如 irb gt rental gt
  • 使用 PowerShell 以 UTF-8 写入无 BOM 的文件

    Out File使用 UTF 8 时似乎会强制使用 BOM MyFile Get Content MyPath MyFile Out File Encoding UTF8 MyPath 如何使用 PowerShell 以 UTF 8 格式写
  • 创建已完成的任务

    我正在实现一个方法Task
  • Scala“<-”用于理解

    我发现 Scala 总是对任何事情都有 自然的解释 总是类似 哦 但这只是用这个和那个参数在这个和那个对象上调用的函数 从某种意义上说 没有什么是真正像我们从其他语言中了解到的那样具有编译器魔力 我的问题是关于 lt 运算符如以下代码中所使