理解 scala:柯里化

2024-02-22

我最近开始学习 Scala 并遇到了柯里化。从这个答案post https://stackoverflow.com/questions/17768686/currying-example-in-scala,这段代码片段

def sum(a: Int)(b: Int) = a + b

扩展到这个

def sum(a: Int): Int => Int = b => a + b

然后我看到了一个片段scala-lang http://docs.scala-lang.org/tutorials/tour/automatic-closures.html,这表明可以编写类似的内容来模拟 while 循环

  def whileLoop (cond : => Boolean) (body : => Unit) : Unit = {
      if (cond) {
          body
          whileLoop (cond) (body)
      }
  }

出于好奇,我尝试扩展它,并得到了这个

  def whileLoop2 (cond : => Boolean) : (Unit => Unit) =
      (body : => Unit) =>
          if (cond) {
              body
              whileLoop2 (cond) (body)
          }

但似乎缺少一些语法,因为我收到错误

error: identifier expected but '=>' found.
(body : => Unit) => 
        ^

扩展模拟 while 循环的正确方法是什么?


棘手的部分是处理无参数函数或“thunk”类型=> Unit。这是我的版本:

def whileLoop2 (cond: => Boolean): (=> Unit) => Unit =
  body =>
    if (cond) {
      body
      whileLoop2 (cond)(body)
    }

var i = 5
val c = whileLoop2(i > 0)
c { println(s"loop $i"); i -= 1 }

看来你可以用注释返回类型(=> Unit) => Unit,但你不能注释(body: => Unit),所以你必须依赖这里的类型推断。

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

理解 scala:柯里化 的相关文章

随机推荐

  • NodeJS 4 和 5 npm 安装 bcrypt 和 db-migrate 失败

    前一段时间我安装了 NodeJS v0 10 31 并在一个项目上工作没有问题 但最近我决定更新到 Node v5 0 0 一切都很好 直到我决定使用 bcrypt 和 db migrate 调用命令npm 安装将无法吐出一长串详细信息 但
  • Magento - 通过库存查找缺货产品

    在我的 Magento 商店中 在将新库存添加到缺货商品后 我有时会忘记从下拉列表中选择 有货 是否有可能以某种方式获取所有有库存但标记为 缺货 的产品的列表 如果您能够快速编写一些脚本 products Mage getModel cat
  • Django 管理员:如何过滤整数字段以获取特定范围的值

    如何在 Django Admin 中创建过滤器以仅显示整数值位于两个值之间的记录 例如 如果我有一个模型 Person 它具有年龄属性 并且我只想显示年龄在 45 到 65 之间的 Person 记录 您可以使用以下方式过滤字段querys
  • numpy:累积多重数计数

    我有一个可能有重复的有序整数数组 我想计算连续的相等值 当一个值与前一个值不同时从零重新开始 这是使用简单的 python 循环实现的预期结果 import numpy as np def count multiplicities a r
  • 用于测试私有方法的Java工具?

    对于测试私有方法的意义有不同的看法 例如 here https softwareengineering stackexchange com questions 16732 unit testing internal components a
  • 使用本机 CSS 和 HTML 设置漏斗堆栈布局样式

    我想显示类似漏斗堆栈的数据 如下图所示 我能够使用边框创建锥度 例如 div class taper div 并使用以下 CSS taper width 200px height 0px border color lightgray tra
  • 如何在应用程序启动时获取旋转进度条

    我是安卓新手 我设法将 JSON 文件解析到我的应用程序中 现在我想使用 AsyncTask 获取 Spinning ProgressBa 直到应用程序启动并加载数据 我尝试阅读很多内容 但它们只给出如何获取 onclick 事件或下载事件
  • 广播接收器 onReceive 在位置更改时触发两次

    我想知道用户何时关闭 GPS 我想了解不同活动中的这一行动 我制作了广播接收器来监听 GPS 状态的变化 但几乎总是当我关闭 GPS 时 我的 updateValue 函数会被触发两次 当用户关闭 GPS 时如何收到通知 我做错了什么 下面
  • 使用 GData 进行搜索查询的 YouTube UITableView

    我正在尝试自定义表格视图以根据搜索查询显示 YouTube 视频的提要 我找到了这段代码http pastebin com vmV2c0HT http pastebin com vmV2c0HT它在表格视图中显示 YouTube 频道的提要
  • DisabledBackend:Celery、Redis 和 Flask 的不稳定行为

    我已经使用 Celery 一段时间了 在生产中我使用 RabbitMQ 作为代理 使用 Redis 作为 K8s 集群中的后端 到目前为止没有任何问题 在本地 我运行一个包含一些服务 Flask API 2 个不同的 Workers Bea
  • emgucv:C# 中的 pan 卡不正确的倾斜检测

    我有三个泛卡图像 用于使用 emgucv 和 c 测试图像的倾斜 顶部的第一张图像检测到 180 度工作正常 中间的第二张图像检测到的 90 度应检测为 180 度 第三张图像检测到 180 度应检测为 90 度 我想在这里分享的一个观察结
  • 在 Docker 容器中安装 Web 应用程序:拨打 unix /var/run/docker.sock: no such file or directory

    我正在尝试在 Docker 容器中安装 Web 应用程序 我使用的是 OS X Yosemite 版本 10 10 1 我一直在关注这里关于 Dockerizing Node js Web App 的教程 https docs docker
  • 为什么 C# 构造函数无法推断类型?

    为什么构造函数不支持泛型方法的类型推断 public class MyType
  • CodeIgniter 项目上的第一个 HTTP 请求的延迟非常高

    我和一个朋友刚刚开始从事一个项目 其他人几年前就停止了开发 我们正在努力恢复它 我们已经解决了大部分与设置相关的问题 但有一个非常烦人的问题我们无法解决 在我们的本地主机中 所有页面都占用A LOT加载 刷新的时间 我指的不是资产 脚本或任
  • 如何让散景悬停工具捕捉数据?

    我希望散景悬停工具捕捉到数据点 而不是在线上插入鼠标位置 这是我认为可以做到这一点的代码 但我仍然在显示中获得插值数据 from bokeh plotting import figure output file show from boke
  • 通过 API 迭代 mailchimp 模板中的集合

    是否有机会通过 API 填写可重复的部分 例如 我有产品列表 我只想在模板中包含一次产品部分 然后迭代集合 我已经阅读了之前关于该主题的讨论并进行了谷歌搜索 但我仍然不明白是否可以通过 API 实现 div h2 Title h2 p Bo
  • 在 Windows(Vista 和 XP)上安装 Exuberant Ctags

    我想在工作时在 Vista 也可能是 XP 笔记本电脑 上使用 Exuberant Ctags 关于操作系统没有选择 我使用 GVim 而不是我的同事推荐的 Flex Builder 因为 FB 有问题并且无论如何也不能做 GVim 所做的
  • 是否有一个 create() 供 vuex 操作自动调度

    我在 vuex 中有一个操作 我想在 vuex 本身而不是组件中自动调度 我创建了一个通知栏 它通过多个页面上的不同通知进行更改 当我切换页面时 通知不是从头开始 而是创建了一个商店来设置要显示的通知 我想从 vuex 内部而不是从组件内部
  • ICU自定义音译

    我希望利用 ICU 库进行音译 但我想为一组特定的自定义音译提供自定义音译文件 以便在编译时合并到 ICU 核心中 以便在其他地方以二进制形式使用 出于兼容性原因 我正在使用 ICU 4 2 的源代码 据我了解 从他们网站的 ICU 数据页
  • 理解 scala:柯里化

    我最近开始学习 Scala 并遇到了柯里化 从这个答案post https stackoverflow com questions 17768686 currying example in scala 这段代码片段 def sum a In