为什么 Scala 有时会自动应用 thunk?

2024-03-17

就在 2 点 40 分之后卡特隆之影 http://www.youtube.com/user/ShadowofCatron's Scala 教程 3 视频 http://www.youtube.com/watch?v=R3gh9jIIbME,指出了a 名称后面的括号thunk http://en.wikipedia.org/wiki/Thunk#Functional_programming are optional。 “嗯?”我的函数式编程大脑说,因为函数的值和它在应用时评估的值是完全不同的东西。

所以我写了以下内容来尝试一下。评论中描述了我的思考过程。

object Main {

    var counter: Int = 10
    def f(): Int = { counter = counter + 1; counter }

    def runThunk(t: () => Int): Int = { t() }

    def main(args: Array[String]): Unit = {
        val a = f()     // I expect this to mean "apply f to no args"
        println(a)      // and apparently it does

        val b = f       // I expect this to mean "the value f", a function value
        println(b)      // but it's the value it evaluates to when applied to no args
        println(b)      // and the application happens immediately, not in the call

        runThunk(b)     // This is an error: it's not println doing something funny
        runThunk(f)     // Not an error: seems to be val doing something funny
    }

}

 

为了清楚地说明问题,这个Scheme 程序(以及随后的控制台转储)显示了我期望Scala 程序执行的操作。

(define counter (list 10))
(define f (lambda ()
            (set-car! counter (+ (car counter) 1))
            (car counter)))

(define runThunk (lambda (t) (t)))

(define main (lambda args
               (let ((a (f))
                     (b f))
                 (display a) (newline)
                 (display b) (newline)
                 (display b) (newline)
                 (runThunk b)
                 (runThunk f))))

> (main)
11
#<procedure:f>
#<procedure:f>
13

 

来到这个网站询问这个问题后,我发现这个答案 https://stackoverflow.com/questions/1450456/get-function-value-of-a-instance-method-in-scala/1450486#1450486它告诉我如何修复上述 Scala 程序:

    val b = f _     // Hey Scala, I mean f, not f()

但只需要下划线“提示”有时。当我打电话时runThunk(f),不需要任何提示。但是当我用 a 将 f '别名' 为 b 时val然后应用它,它不起作用:应用程序发生在val;乃至lazy val以这种方式工作,所以这不是导致这种行为的评估点。

 

这一切都给我留下了一个问题:

为什么斯卡拉有时在评估它们时自动应用 thunk?

正如我怀疑的那样,它是类型推断吗?如果是这样,类型系统不应该脱离语言的语义吗?

这是一个好主意吗? Scala 程序员是否应用 thunk 而不是引用它们的值更频繁地使括号可选总体上更好?


在 R5RS 中使用 Scala 2.8.0RC3、DrScheme 4.0.1 编写的示例。


问题就在这里:

嗯?”我的函数式编程说 大脑,因为函数的值 以及它评估时的值 应用完全不同 事物。

是的,但你没有声明任何函数。

def f(): Int = { counter = counter + 1; counter }

你宣布了​​一个method called f它有一个空参数列表,并返回Int。方法不是函数——它没有值。永远不能。你能做的最好的就是得到一个Method通过反射实例,这根本不是同一件事。

val b = f _     // Hey Scala, I mean f, not f()

那么,什么是f _方法?如果f是一个函数,这意味着函数本身,当然,但这里的情况并非如此。它的真正含义是这样的:

val b = () => f()

换句话说,f _ is a closure通过方法调用。而闭包是通过函数来​​实现的。

最后,为什么 Scala 中空参数列表是可选的?因为虽然 Scala 允许这样的声明def f = 5,Java没有。 Java 中的所有方法都至少需要一个空参数列表。有很多这样的方法,在 Scala 风格中,没有任何参数(例如,length and size)。因此,为了使代码在空参数列表方面看起来更加统一,Scala 使它们成为可选的。

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

为什么 Scala 有时会自动应用 thunk? 的相关文章

  • Spark:替换嵌套列中的空值

    我想更换所有n a以下数据框中的值unknown 它可以是scalar or complex nested column 如果它是一个StructField column我可以循环遍历列并替换n a using WithColumn 但我希
  • “函数是第一等值”这到底是什么意思?

    有人可以用一些很好的例子清楚地解释它吗 在解释函数式编程时 我在 Scala 中遇到了这句话 一流 并不是一个正式定义的概念 但它通常意味着一个实体具有三个属性 有可能used 不受限制 只要 普通 值可以 即从函数传递和返回 放入容器等
  • 如何设计具有相互依赖的测试的 Specs2 数据库测试?

    有没有一些首选的方法来设计Specs2 http etorreborre github com specs2 测试 有很多测试取决于之前测试的结果 下面 您将找到我当前的测试套件 我不喜欢var位于测试片段之间 不过 它们是 需要的 因为某
  • 用惯用的 Scala 更新大型数据结构

    我已经尝试 Scala 一段时间了 并且经常遇到支持不可变数据结构的建议 但是当你有一个像这样的数据结构时3D 场景图 大型神经网络或任何具有大量需要频繁更新的对象的东西 对场景中的对象进行动画处理 训练神经网络 这似乎是 运行时效率极低
  • 清理 IntelliJ 中构建的 Play 框架

    我有一个拼写错误conf routes文件导致 Play Framework 生成错误命名的类 重建项目并运行Invalidate Caches并没有解决 IntelliJ 中的问题 当我手动运行时重新生成了不正确的类文件play clea
  • 如何将模型从 ML Pipeline 保存到 S3 或 HDFS?

    我正在尝试保存 ML Pipeline 生成的数千个模型 正如答案中所示here https stackoverflow com questions 32121046 run 3000 random forest models by gro
  • 什么是欣德利米尔纳?

    我遇到过这个词欣德利 米尔纳 我不确定是否理解它的意思 我已阅读以下帖子 史蒂夫 叶格 动态语言的反击 http steve yegge blogspot com 2008 05 dynamic languages strike back
  • Scala 中抛出异常,什么是“官方规则”

    我正在 Coursera 上学习 Scala 课程 我也开始阅读 Odersky 的 Scala 书 我经常听到的是 在函数式语言中抛出异常不是一个好主意 因为它破坏了控制流 并且我们通常返回一个失败或成功的 Either Scala 2
  • Haskell scala 互操作性

    我是 Scala 初学者 来自面向对象范式 在了解 Scala 的函数式编程部分时 我被引导到 Haskell 纯函数式编程语言 探索 SO 问题答案 我发现 Java Haskell 具有互操作性 我很想知道 Scala Haskell
  • 将字符定义为单词边界

    我已经定义了 字符在乳胶模式下充当单词组成部分 我对结果非常满意 唯一困扰我的是像这样的序列 alpha beta被视为单个单词 当然 这是预期的行为 有没有办法让 emacs 将特定字符解释为单词 starter 这样 它将始终被视为其后
  • 如何在Gradle中支持多种语言(Java和Scala)的多个项目?

    我正在尝试将过时的 Ant 构建转换为 Gradle 该项目包含约50个Java子项目和10个Scala子项目 Java 项目仅包含 Java Scala 项目仅包含 Scala 每个项目都是由 Java 和 Scala 构建的 这大大减慢
  • 在 Akka 中配置嵌套 Router

    我有一些嵌套的路由器 应创建它FromConfig 我想要的是这样的 test akka actor deployment worker router round robin nr of instances 5 slave router b
  • 如何将模型结果保存到文本文件?

    我正在尝试将从模型生成的频繁项集保存到文本文件中 该代码是 Spark ML 库中 FPGrowth 示例的示例 Using saveAsTextFile直接在模型上写入 RDD 位置而不是实际值 import org apache spa
  • Scala 2.9 无法在 Windows XP 上运行“hello world”示例

    我正在尝试在 Windows XP 上使用 scala 2 9 1 Final 运行 HelloWorld 示例 object HelloWorld extends App println Hello World 文件另存为Hello sc
  • 具有两个通用参数的上下文边界

    在 Scala 中 我可以使用上下文边界 def sort T Ordered t Seq T 与以下意思相同 def sort T t Seq T implicit def Ordered T 如果我有一个带有两个泛型参数的类怎么办 IE
  • 从 HList 获取元素

    我尝试了 HList 并按预期进行了以下工作 val hl 1 foo HNil val i Int hl 0 val s String hl 1 但是 我无法让以下代码正常工作 让我们暂时假设对列表进行随机访问是一个聪明的主意 class
  • 可选择将项目添加到 Scala 映射

    我正在寻找这个问题的惯用解决方案 我正在构建一个valScala 不可变 Map 并希望有选择地添加一项或多项 val aMap Map key1 gt value1 key2 gt value2 if condition key3 gt
  • 如何使用 Spark 2 屏蔽列?

    我有一些表 我需要屏蔽其中的一些列 要屏蔽的列因表而异 我正在读取这些列application conf file 例如 对于员工表如下所示 id name age address 1 abcd 21 India 2 qazx 42 Ger
  • 为什么用scala写的代码比用java写的慢6倍?

    我不确定我在编写 scala 代码时是否犯了一些错误 问题是 The four adjacent digits in the 1000 digit number that have the greatest product are 9 9
  • Scala中有类似Java Stream的“peek”操作吗?

    在Java中你可以调用peek x gt println x 在 Stream 上 它将对每个元素执行操作并返回原始流 这与 foreach 不同 foreach 是 Unit Scala 中是否有类似的东西 最好是适用于所有 Monady

随机推荐

  • Java中JTextArea的自动动态扩展/收缩

    我首先创建一个特定大小的 JTextArea 用户可以在其中添加文本 但如果文本太长 垂直或水平 则会被截断 我希望 JTextArea 自动扩展或收缩 用于删除文本 我将来可能允许用户更改字体和字体大小 因此如果我可以避免使内容增加 减少
  • C# 和 WPF - 使用 SecureString 作为客户端 HTTP API 密码

    在编写 WPF 应用程序时 PasswordBox将输入的密码存储为SecureString 这完全有道理 但是 我想通过 HTTP API 发送密码 并且HttpClientPostAsync 似乎接受表单编码数据的字符串 我知道其他人也
  • CheckedListBox - 通过文本搜索项目

    我有一个CheckedListBox绑定到一个DataTable 现在我需要以编程方式检查一些项目 但我发现SetItemChecked 方法仅接受项目索引 有没有一种实用的方法可以在不知道项目索引的情况下通过文本 标签获取项目 注意 我对
  • 无法在 Linux 上安装 sqldf

    我在 Linux 上运行 R 版本 2 14 1 当我尝试安装 sqldf 时 install packages sqldf dependencies TRUE 我收到以下错误 这些错误导致从终端运行命令 就像使用 Rcmdr UI 一样
  • mongoDB 错误:错误:无法连接到 [localhost:27017]

    我正在尝试安装habitrpg https github com busterroni habitrpg在本地 但我在输入后不断收到 mongoDB 错误node src seed js Error failed to connect to
  • C# Mono Linux - 抓取全局剪贴板的内容

    我试图简单地从剪贴板 抓取 文本并将其放入变量中 我在做这件事时遇到了很多麻烦 我尝试过使用 Gtk Clipboard Get Gdk Atom Intern PRIMARY true 到目前为止 我的代码只是将 Gtk Clipboar
  • youtube-api removeEventListener 不工作

    我可以很好地添加事件 addEventListener onStateChange handleStateChange 但当尝试删除该事件时 却没有 removeEventListener onStateChange handleState
  • 获取当前位置div的ID

    我有n个 section 在一个页面中 每个页面都提供了 id 例如 page1 page2 在顶部我放置了 2 个按钮 即 上一个 和 下一个 当按下上一个按钮时 它将滚动到上一个 section 与下一个类似 section 按 下一步
  • JAX-WS - 添加 SOAP 标头

    我正在尝试创建一个独立的客户端来使用一些网络服务 我必须将我的用户名和密码添加到 SOAP 标头中 我尝试添加凭据 如下所示 OTSWebSvcsService service new OTSWebSvcsService OTSWebSvc
  • Facebook 应用程序请求通知未显示在移动网络应用程序的 Facebook iOS 应用程序中

    我有一个配置为 Facebook 画布应用程序的 Facebook 应用程序以及一个包含网站和移动网站 URL 的网站 当应用程序发送应用程序请求 邀请 时 它们仅显示在桌面浏览器中的收件人通知中 而不显示在 Facebook iOS 应用
  • Firebase DatabaseReference 按指定值过滤

    假设我有这个 firebase JSON 结构 我需要获取属性 from 等于 this 的所有问题 我知道我可以使用 Volley 来创建 StringRequest 并从我的 questions json 中获取所有值 然后 在客户端
  • 如何让服务帐户只能访问一个存储桶(Google Cloud)?

    如何提供服务帐号只能访问一个桶 如果你以防万一想再给一个第3方服务访问您的private bucket 问题是默认的 服务帐户 可以访问所有存储桶 但我不知道如何将其限制为仅限一个存储桶 是否可以通过仪表板或仅通过控制台来实现此目的 如果可
  • 向样式组件添加过渡

    我在 React 中有以下组件 const Button styled div width 30px height 30px position absolute right 2em top 50 transform translateY 5
  • 使用秒表分析 .NET 应用程序

    似乎没有免费的 NET 性能分析器可以逐行进行分析 因此 我正在考虑使用秒表进行分析 免费即自由 即许可证包括商业应用程序 编辑 为了回应那些告诉我 购买分析器 的人 我愿意 但如果我能花那么多钱 我会把它花在其他东西上 我试图让我的老板相
  • 如何仅循环 select() 的 fd_set 结果中的活动文件描述符?

    所以在我当前的服务器实现中 目前是这样的 void loop step 1 clear set fd set readfds while true step 1 FD ZERO readfds step 2 loop through soc
  • Node.js UDP (dgram) 处理 DNS 解析错误

    我正在使用 Node 的内置数据报 UDP 套接字进行简单的 UDP 发送 http nodejs org docs v0 3 1 api dgram html http nodejs org docs v0 3 1 api dgram h
  • Django 从注释计数中排除

    我有以下申请 from django db import models class Worker models Model name models CharField max length 60 def str self return se
  • 如何在 C 中处理指针? [复制]

    这个问题在这里已经有答案了 我对 C 很陌生 在学习指针方面遇到了一些问题 我尝试了交换 这就是我能用它们做的所有事情 我知道每个变量在内存单元中都有自己的地址 这是我的讲师告诉我们的 并且每个变量的值都可以通过转到其关联的地址来获取 然后
  • Kendo UI DatePicker - 获取先前的值

    当用户使用日期选择器更改日期时 我尝试进行确认 是否可以从对象模型中获取先前的值 或者我需要推出自己的值 没有 据我所知 但你可以很容易地实现它 如下所示 var datePicker date kendoDatePicker change
  • 为什么 Scala 有时会自动应用 thunk?

    就在 2 点 40 分之后卡特隆之影 http www youtube com user ShadowofCatron s Scala 教程 3 视频 http www youtube com watch v R3gh9jIIbME 指出了