函数参数中没有 LHS 的“双右箭头类型”是什么意思

2024-03-01

我无法解释指定为没有 LHS(左侧)的函数参数的“双右箭头类型”,例如() => Int来自() to Int但什么只是=> Int意思是? 例如请参阅第一个参数foo下面的方法,是什么类型f? Is it (Int, () => Int) => Int?

对于定义bar,其中 y 按名称传递,我将其解释为不带参数的函数,该函数将生成 Int,这看起来相当于定义baz.

我可以尝试推理f in foo将第二个参数视为按名称调用,并且不是来自() => Int但这与事实相矛盾bar and bazjavap 中的定义是相同的。我缺少什么?

object ParamTest {
  def foo(f: (Int, => Int) => Int, x: Int) : Int = 10
  def bar(x: Int, y: => Int) : Int = 20
  def baz(x: Int, f: () => Int) : Int = 30
  def qux(f: (Int, () => Int) => Int, x: Int) : Int = 40
}

为了测试我编译了上面的类scalac ParamTest.scala

javap ParamTest给我:

public final class ParamTest {
  public static int qux(scala.Function2<java.lang.Object, scala.Function0<java.lang.Object>, java.lang.Object>, int);
  public static int baz(int, scala.Function0<java.lang.Object>);
  public static int bar(int, scala.Function0<java.lang.Object>);
  public static int foo(scala.Function2<java.lang.Object, scala.Function0<java.lang.Object>, java.lang.Object>, int);
}

这似乎表明 foo 和 qux 具有相同的方法签名。换句话说,我可以解释=> Int as () => Int, but foo(baz,100)给我一个类型不匹配错误

scala> import ParamTest._
import ParamTest._

scala> foo(bar,100)
res0: Int = 10

scala> foo(baz,100)
<console>:11: error: type mismatch;
 found   : (Int, () => Int) => Int
 required: (Int, => Int) => Int
              foo(baz,100)
                  ^

EDIT: 这和这个问题 https://stackoverflow.com/questions/4543228/whats-the-difference-between-and-unit。我不是问两者之间的实际区别call-by-name: => Type and () => Type。我更感兴趣的是了解内部结构。 scala 如何区分这两者,当 javap 或CFR反编译 http://www.benf.org/other/cfr/给了我相同的定义foo and qux;并为bar and baz.


正如你所发现的,() => A and => A不是同一件事。

按姓名呼叫(即=> A) 只是意味着:“延迟对此方法参数的评估。”换句话说,就是惰性评估。

def f(x: Int, y: => Int) = ???

f(3+5, 2+4)

在此示例中,3+5 的加法是在调用站点完成的,并且x值为 8。另一方面,2+4 的加法直到y在方法体内被引用f()。如果该引用位于if...else...如果分支没有被执行,那么添加就永远不会完成。

这对于像这样的简单评估来说毫无意义Int加法,但如果参数是一个昂贵的评估,或者它是一个具有副作用的代码块,那么它就变得更有意义。

所以,在回答你的问题时,它的含义f: (Int, => Int) => Int is: "f接受两个参数并产生一个Int,参数为 2Int是,其中第二个被延迟评估。”

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

函数参数中没有 LHS 的“双右箭头类型”是什么意思 的相关文章

  • 具有上限的联合类型

    我正在遵循这个问题的公认答案中提出的技术如何定义 类型析取 联合类型 https stackoverflow com questions 3508077 does scala have type disjunction union type
  • Play框架:单属性案例类的JSON读取

    我正在尝试为包含单个属性的案例类创建隐式 JSON Reads 但收到错误 Reads Nothing 不符合预期类型 这是代码 import play api libs functional syntax import play api
  • Scala:什么是 CompactBuffer?

    我试图弄清楚 CompactBuffer 的含义 和迭代器一样吗 请解释其中的差异 根据 Spark 的文档 它是 ArrayBuffer 的替代方案 可以提供更好的性能 因为它分配的内存更少 以下是 CompactBuffer 类文档的摘
  • 理解 Scala FP 库

    只是为了让那些想要开始使用 Scala FP 库 在纯 FP 方面变得更好的人快速清晰地了解 有人能澄清猫和猫效应 猫效应 IO 之间的区别 关系吗 最重要的是 齐奥和莫尼克斯对此有何看法 最后 与 ScalaZ 7 8 有何关系 到目前为
  • scala中的反引号有什么用[重复]

    这个问题在这里已经有答案了 我在一本书上找到了以下代码 val list List 5 4 3 2 1 val result 0 list running total next element running total next elem
  • Scala Spark 包含与不包含

    我可以使用 contains 过滤 RDD 中的元组 如下所示 但是使用 不包含 来过滤 RDD 又如何呢 val rdd2 rdd1 filter x gt x 1 contains 我找不到这个的语法 假设这是可能的并且我没有使用Dat
  • 为什么自类型类可以声明类

    我知道 Scala 只能混合特征 这对于依赖注入和蛋糕模式是有意义的 我的问题是为什么我仍然可以声明一个需要另一个 类 但不需要特征的类 Code class C class D self C gt 这仍然编译成功 我认为它应该编译失败 因
  • 如何在 sbt 控制台中加载 scala 文件? [复制]

    这个问题在这里已经有答案了 可能的重复 将 Scala 文件加载到解释器中以使用函数 https stackoverflow com questions 7383436 load scala file into interpreter to
  • Spark 2.2 无法将 df 写入 parquet

    我正在构建一个聚类算法 我需要存储模型以供将来加载 我有一个具有以下架构的数据框 val schema new StructType add StructField uniqueId LongType add StructField tim
  • Scala 案例类忽略 Spark shell 中的导入

    我希望这个问题有一个明显的答案 我刚刚升级到 Spark v2 0 并且遇到了一个奇怪的问题火花外壳 Scala 2 11 版本 如果我输入以下最小的 Scala import java sql Timestamp case class C
  • IntelliJ IDEA 不会从 SBT 项目加载 Lift 库

    我通过创建了一个空白项目sbt使用最基本的指南 具体来说 gt cd xyz gt sbt here we create a new project w Scala 2 8 1 gt lift is org lifty lifty 1 6
  • 正确使用术语 Monoid

    从下面的例子来看 我认为这样的说法是正确的String在串联运算下定义了一个幺半群 因为它是关联二元运算 并且String碰巧有一个身份元素 它是一个空字符串 scala gt Jane Doe Jane Doe res0 Boolean
  • 当泛型类型与无界通配符一起使用时,不考虑类型参数绑定

    在我的项目中 我有一个这样的星座 trait F trait X A lt F def test x X X lt F x Trait X有一个类型参数 其上限为F 根据我的理解 类型X and X lt F 应该是等价的 但scalac2
  • 在没有匹配器的情况下如何跳过specs2中的测试?

    我正在尝试使用 scala 中的 specs2 测试一些与数据库相关的内容 目标是测试 db running 然后执行测试 我发现如果数据库关闭 我可以使用 Matcher 类中的 orSkip 问题是 我正在获取一个匹配条件的输出 作为
  • 过滤器的 Scala 集合类型

    假设您有一个 List 1 1 其类型为 List Any 这当然是正确的且符合预期 现在如果我像这样映射列表 scala gt List 1 1 map case x Int gt x case y String gt y toInt 结
  • 解决 sbt 中 jar 加载冲突的问题

    当两个特定的 sbt 插件启动时 我在 sbt 启动时收到以下错误加在一起到其构建定义中的项目 这些 sbt 插件之一是规模化jdbc https github com scalikejdbc scalikejdbc另一个是my own h
  • InvalidRequestException(为什么:empid 如果包含 Equal,则不能被多个关系限制)

    这是关于我从 Apache Spark 查询 Cassandra 时遇到的问题 Spark 的正常查询工作正常 没有任何问题 但是当我使用关键条件进行查询时 出现以下错误 最初 我尝试查询复合键列族 它也给出了与下面相同的问题 由以下原因引
  • 如何使方法通用而不出现“未找到匹配的形状”

    除了编写大量样板文件之外 我不知道如何克服这个 找不到匹配的形状 错误 要点中说明的基本思想是 我有一个非常基本的方法版本 有效 但非常具体 然后是一个采用mapper参数并且更通用 也可以工作 但特定于一种特定类型 然后是第三个版本 它采
  • 使用什么框架来引导我的第一个生产 scala 项目?

    我正在第一次涉足 scala 的生产应用程序 该应用程序当前打包为 war 文件 我的计划是创建 scala 编译工件的 jar 文件 并将其添加到 war 文件的 lib 文件夹中 我的增强功能是通过 Jersey 公开的 mysql 支
  • Spark:导入UTF-8编码的文本文件

    我正在尝试处理一个包含很多特殊字符的文件 例如德语变音符号 o 等 如下所示 sc hadoopConfiguration set textinputformat record delimiter r n r n sc textFile f

随机推荐

  • 克服 NSURL 的 checkResourceIsReachableAndReturnError 的意外行为

    在我为 iOS 5 创建的程序中 我遇到了 NSURL 的 checkResourceIsReachableAndReturnError 方法的意外行为 我创建了一个新项目来验证该问题 并仅包含代码 NSURL url NSURL URLW
  • Pandas:两个 datetime64 对象的差异产生 NaT 而不是正确的 timedelta 值

    这个问题 被问了很多 但仔细查看其他答案后 我还没有找到适合我的情况的解决方案 遗憾的是 这仍然是一个症结所在 我有一个pandas带列的数据框datetime我只是想计算数据覆盖的时间范围 以秒为单位 比如说 from datetime
  • 查询一段时间内的 DAU/MAU(每日)

    我有一个每日会话表 其中包含 user id 和日期列 我想绘制每天的 DAU MAU 每日活跃用户 每月活跃用户 图表 例如 Date MAU DAU DAU MAU 2014 06 01 20 000 5 000 20 2014 06
  • Spring Cloud Stream Kafka - 方法必须是声明性的

    我已经使用 Spring Cloud Stream 配置了一个基于 Spring Boot 的应用程序 我正在尝试处理 KStream 但不断收到错误 java lang IllegalArgumentException 方法必须是声明性的
  • 自训练算法

    我想针对特定问题开发一种自我训练算法 为了简单起见 我将把它归结为简单的例子 更新 我添加了一个工作解决方案作为下面这个问题的答案 假设我有来自数据库的大量实体列表 每个实体都是相同的类型 并且有 4 个字节类型的属性 public cla
  • Maven - 如何重命名 jar 名称的输出分类器?

    我正在尝试重命名属于 WAR 项目一部分的 jar 文件名的默认输出分类器 默认情况下 它会生成以下输出 jar project artifactId project version classifier 在我的示例中 它将生成 myweb
  • 解决“配置对象是只读的,因为它已通过调用 ServerManager.CommitChanges() 提交”?

    我为安装程序项目编写了一个自定义操作 该操作执行以下操作 检查现有网站是否存在同名网站 由用户输入 如果该网站不存在 则在 IIS 中创建该网站 创建应用程序池 将应用程序池分配给创建的网站 当涉及到分配应用程序池时 我收到错误 配置对象是
  • 使用 XML 设置选项卡小部件的样式

    所以我在使用 xml 设计选项卡小部件时遇到了很大的困难 我搜索过的所有地方似乎都建议以编程方式执行此操作的解决方案 或者引用 actionBarTab 样式 gt 我想要实现的是使用生成的 qtabwidget 可绘制对象的自定义选项卡h
  • 我可以在 Google Apps 脚本上设置每小时特定时间的触发器吗?

    我有一个链接到谷歌表格文档的谷歌应用程序脚本 我想在每小时的顶部运行脚本 即恰好下午 1 00 00 下午 2 00 00 下午 3 00 00 等 我已经在 管理项目的触发器 设置中设置了每小时触发器 但是 这将在一小时内选择一个随机时间
  • 将外部模块 TypeScript 声明暴露给使用模块

    我有一个已发布的 TypeScript 模块 我们称之为shared stuff 旨在由其他 TypeScript 模块导入 这shared stuff模块具有第三方依赖项 但没有 types 范围声明 因此该模块内部有几个声明文件 lib
  • T-SQL UDF 与完整表达式运行时

    我试图通过在 SQL SERVER 中使用 UDF 使我的查询可读 但使用该函数时运行时间会急剧增加 以下是我正在使用的功能 create function DL trim all input varchar max returns var
  • 使属性不可枚举有什么好处?

    可枚举性是属性的三个属性之一 可写性 可枚举性和可配置性 我的问题是 在 JavaScript 中使属性不可枚举有什么好处 我知道我们通过使属性不可枚举来隐藏属性 但是隐藏属性有什么好处呢 我们可以访问不可枚举的属性吗 如果是 那么使它们不
  • Android ImageView连续放大和缩小

    有什么办法可以放大和缩小ImageView在Android中不断 我尝试使用下面的代码 但只有一个缩放功能可以工作 缩放 xml
  • iPhone 上 Objective C 中的静态字符串变量

    如何在 iPhone 中创建和访问静态字符串 目标 c 我声明static NSString str OldValue 在A类 如果我在 B 类中为此分配一些值str NewValue 该值对于 B 类中的所有方法都有效 但是 如果我在 C
  • Java线程中的定时器

    我有一个线程负责执行一些过程 我想让这些处理每 3 秒完成一次 我使用了下面的代码 但是当线程启动时 什么也没有发生 我假设当我为计时器定义任务时它会自动执行ScheduledTask在时间间隔内但它根本不做任何事情 我缺少什么 class
  • Swift 中的快速排序出现错误

    我正在 Swift 中使用高阶函数编写快速排序 但它给出了 error Int is not convertible to Int return quickSort array lesser pivot quickSort array gr
  • 使用 WEBrick 为 PHP Web 应用程序提供服务

    我是一名 PHP 开发人员 已经开始学习 Ruby on Rails 我喜欢启动和运行 Rails 应用程序开发是多么容易 我最喜欢的东西之一是 WEBrick 它使您不必为您正在处理的每个小项目配置 Apache 和虚拟主机 WEBric
  • BitBucket WebHook 詹金斯

    我想配置 bitbucket 来触发 jenkins 构建 我花了一些时间研究这个问题 所有答案都来自几年前 但没有找到任何指南 因为从那以后事情似乎发生了变化 我正在尝试做的事情 将位桶推送到特定分支会触发构建 我有什么 Bitbucke
  • 在 IE 中通过 Iframe 传递参数时出现问题

    我正在尝试从我的网站执行 HTTP GET 到通过 iframe 引入的另一个网站 在 Firefox 上 您可以在源代码中看到 iframe src 中存在正确的 url 及其正确的参数 并且它可以工作 在 IE 上 您可以在源代码中看到
  • 函数参数中没有 LHS 的“双右箭头类型”是什么意思

    我无法解释指定为没有 LHS 左侧 的函数参数的 双右箭头类型 例如 gt Int来自 to Int但什么只是 gt Int意思是 例如请参阅第一个参数foo下面的方法 是什么类型f Is it Int gt Int gt Int 对于定义