为什么scala不进行尾调用优化?

2023-12-22

只是玩延续。目标是创建将接收另一个函数作为参数和执行量的函数,并返回将应用参数给定次数的函数。

实现看起来很明显

def n_times[T](func:T=>T,count:Int):T=>T = {
  @tailrec
  def n_times_cont(cnt:Int, continuation:T=>T):T=>T= cnt match {
        case _ if cnt < 1 => throw new IllegalArgumentException(s"count was wrong $count")
        case 1 => continuation
        case _ => n_times_cont(cnt-1,i=>continuation(func(i)))
      }
  n_times_cont(count, func)
}

def inc (x:Int) = x+1

    val res1 = n_times(inc,1000)(1)  // Works OK, returns 1001

val res = n_times(inc,10000000)(1) // FAILS

但没有问题 - 这段代码失败并出现 StackOverflow 错误。为什么这里没有尾部调用优化?

我使用 Scala 插件在 Eclipse 中运行它,它返回 线程“main”中的异常 java.lang.StackOverflowError 在 scala.runtime.BoxesRunTime.boxToInteger(来源未知) 在 Task_Mult$$anonfun$1.apply(Task_Mult.scala:25) 在 Task_Mult$$anonfun$n_times_cont$1$1.apply(Task_Mult.scala:18)

p.s.

F# 代码几乎是直接翻译,运行没有任何问题

let n_times_cnt func count = 
    let rec n_times_impl count' continuation = 
        match count' with
        | _ when count'<1 -> failwith "wrong count"
        | 1 -> continuation
        | _ -> n_times_impl (count'-1) (func >> continuation) 
    n_times_impl count func

let inc x = x+1
let res = (n_times_cnt inc 10000000) 1

printfn "%o" res

Scala 标准库has蹦床的实现scala.util.control.TailCalls。因此,重新审视您的实现...当您使用以下命令构建嵌套调用时continuation(func(t)),这些是尾调用,只是编译器没有优化。那么,让我们建立一个T => TailRec[T],其中堆栈帧将替换为堆中的对象。然后返回一个函数,该函数将接受参数并将其传递给该蹦床函数:

import util.control.TailCalls._
def n_times_trampolined[T](func: T => T, count: Int): T => T = {
  @annotation.tailrec
  def n_times_cont(cnt: Int, continuation: T => TailRec[T]): T => TailRec[T] = cnt match {
    case _ if cnt < 1 => throw new IllegalArgumentException(s"count was wrong $count")
    case 1 => continuation
    case _ => n_times_cont(cnt - 1, t => tailcall(continuation(func(t))))
  }
  val lifted : T => TailRec[T] = t => done(func(t))
  t => n_times_cont(count, lifted)(t).result
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么scala不进行尾调用优化? 的相关文章

  • 解析嵌套括号内包含的值

    我只是在开玩笑 奇怪地发现在简单的递归函数中解析嵌套括号有点棘手 例如 如果程序的目的是查找用户详细信息 它可能来自 name surname age to Bob Builder age 然后到Bob Builder 20 这是一个用于在
  • 什么是 Java 8“视图”?

    我正在观看 Paul Philips 的演讲 http www youtube com watch v TS1lpKBMkgg http www youtube com watch v TS1lpKBMkgg 在 12 48 比较 Scal
  • Scala repl 抛出错误

    当我打字时scala在终端上启动 repl 它会抛出此错误 scala gt init error error while loading AnnotatedElement class file usr lib jvm java 8 ora
  • 映射存在类型列表

    我有一个要映射的存在类型对象的列表 像这样的东西 sealed abstract class IntBox val v Int case object IB1 extends IntBox 1 case object IB2 extends
  • “函数是第一等值”这到底是什么意思?

    有人可以用一些很好的例子清楚地解释它吗 在解释函数式编程时 我在 Scala 中遇到了这句话 一流 并不是一个正式定义的概念 但它通常意味着一个实体具有三个属性 有可能used 不受限制 只要 普通 值可以 即从函数传递和返回 放入容器等
  • 在scala / play框架中构建Json文件

    我正在使用 Play 框架和 Scala 我需要提供一个如下所示的输入 id node37 name 3 7 data children 如何使用 json 获取该格式 以下是 Play 框架网站上的示例 val JsonObject Js
  • Scala REPL 中的递归重载语义 - JVM 语言

    使用 Scala 的命令行 REPL def foo x Int Unit def foo x String Unit println foo 2 gives error type mismatch found Int 2 required
  • ';'预期但发现“导入” - Scala 和 Spark

    我正在尝试使用 Spark 和 Scala 来编译一个独立的应用程序 我不知道为什么会收到此错误 topicModel scala 2 expected but import found error import org apache sp
  • Spark:出现心跳错误后丢失数据

    我有一个在 Spark 集群上运行的 Python 程序 有四个工作线程 它处理一个包含大约 1500 万条记录的巨大 Oracle 表 检查结果后发现大约有600万条记录没有插入 我的写入功能如下 df write format jdbc
  • 在 Akka 中配置嵌套 Router

    我有一些嵌套的路由器 应创建它FromConfig 我想要的是这样的 test akka actor deployment worker router round robin nr of instances 5 slave router b
  • 多个 scala 库导致 intellij 出错?

    我正在使用 intellij 14 和 scala 2 11 6 使用 homebrew 安装并使用符号链接 ln s usr local Cellar scala 2 11 6 libexec src usr local Cellar s
  • Scala 2.9 无法在 Windows XP 上运行“hello world”示例

    我正在尝试在 Windows XP 上使用 scala 2 9 1 Final 运行 HelloWorld 示例 object HelloWorld extends App println Hello World 文件另存为Hello sc
  • Akka Stream Graph 恢复问题

    我创建了一个图表来并行化具有相同输入的两个流 这些流产生 Future Option Entity 如果 flowA 失败 我想返回 Future None 但恢复似乎没有被调用 val graph Flow Input Future Op
  • 高效序列化案例类

    对于我正在工作的图书馆 我需要提供一个高效 便捷 typesafe序列化 scala 类的方法 理想的情况是用户可以创建一个案例类 并且只要所有成员都是可序列化的 它似乎也应该如此 我准确地知道序列化和反序列化阶段的类型 因此不需要 也不能
  • 规范化且不可变的数据模型

    Haskell如何解决 规范化不可变数据结构 问题 例如 让我们考虑一个表示前女友 男友的数据结构 data Man Man name String exes Woman data Woman Woman name String exes
  • 在 Scala 中将元素追加到列表末尾

    我无法添加 type 元素T到一个列表中List T 我尝试过myList myElement但它似乎创建了一个奇怪的对象并访问myList last始终返回放入列表中的第一个元素 我怎么解决这个问题 List 1 2 3 4 Result
  • 如何在超时的情况下在单独的调度程序上运行 Akka Streams 图?

    这个问题是基于我做过的一个宠物项目 这个SO https stackoverflow com questions 34641861 akka http blocking in a future blocks the server 34645
  • Akka-Streams 收集数据(Source -> Flow -> Flow (collect) -> Sink)

    我对 Scala 和 Akka 完全陌生 我有一个简单的 RunnableFlow Source gt Flow do some transformation gt Sink runForeach 现在我想要这样的东西 Source gt
  • Scala Spark 包含与不包含

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

    这是 Shapeless 2 3 3 中的一个简单示例 val book author gt gt Benjamin Pierce title gt gt Types and Programming Languages id gt gt 2

随机推荐

  • Mysql排除记录

    我有两张表 用户和角色 一个用户可以拥有多个角色 user ID FIRSTNAME LASTNAME etc 1 PETER Blomp role ID ROLEID USERID which is user ID 70 5 1 pete
  • 如何通过CORS传递cookie?

    我有一个项目 使用 Axios 从客户端发送 HTTP 请求 axios create baseURL http localhost 8081 withCredentials true 我想这允许 cookie 我确信它会在您提出请求之前显
  • 如何使用 OLEDB 从 Excel 文件(2007 格式)读取超过 256 列

    我正在尝试使用 C 中的 OLEDB 导入包含超过 256 列的 Excel 文件 我尝试了各种方法 但似乎不可能从 Excel 2007 格式 文件中读取超过 256 列 我想知道这是一个错误还是我只是错过了一些东西 这是我使用的连接字符
  • 在没有子查询的 MySQL 中,ORDER BY 优先于 GROUP BY

    我有以下查询 它可以完成我想要的操作 但我怀疑可以在没有子查询的情况下执行此操作 SELECT FROM SELECT FROM versions ORDER BY ID DESC AS X GROUP BY program 我需要的是按程
  • 子类化 UILabel

    我在同一个网站上阅读了如何插入和 UILabel 子类 UILabel 并覆盖所需的方法 在将其添加到我的应用程序之前 我决定在独立的测试应用程序中对其进行测试 代码如下所示 这是 MyUILabel h import
  • 仅获取所有父级 WooCommerce 类别

    我正在尝试获取 WooCommerce 的所有父类别 而不是子类别 terms get terms taxonomy gt product cat hide empty gt false parent gt 0 但它不起作用 如何仅获取父类
  • 如何根据列的顺序添加自增主键?

    我需要将自动增量 id 添加到已有的表中 我做了 ALTER TABLE table name ADD column name INT NOT NULL AUTO INCREMENT FIRST ADD PRIMARY KEY column
  • 取消选择 RowDetailsTemplate 后调整数据网格高度

    我正在使用 RowDetailsTemplate 显示行的嵌套数据网格 现在 当我选择一行来显示此嵌套数据网格时 数据网格的高度会扩展 但当取消选择该行时 它不会减少其高度 有没有办法在行详细信息折叠后将数据网格大小调整为其原始高度 是否可
  • 多对多关系的复选框

    class PlayerProfile lt ActiveRecord Base has many playing roles has many player roles through playing roles accepts nest
  • Magento 1.6.2 无法重新索引产品平面数据

    我们的 magento 1 6 2 无法重新索引产品平面数据 有时它还会显示 重新索引过程存在问题 我根据其他用户的经验尝试了很多解决方案 没有结果 我们进口了散装产品 但我们不确定这是重新索引问题的原因 理想的解决方案是什么 这是我在 s
  • 在版权符号之前插入特殊字符“”

    我们的源代码在每个 CSS 文件的顶部都包含版权 版权所有 每次 Firefox 样式编辑器加载 CSS 文件时 都会在版权符号之前插入一个特殊字符 版权所有 每次加载文件时它都会添加一个额外的特殊字符 我不认为这仅限于 Firefox 但
  • 将位图传递给在 logcat 上获取消息的其他活动 FAILED BINDER TRANSACTION

    当我将位图图像传递给其他活动时 我在 logcat 上收到 mag 03 20 12 06 56 553 E JavaBinder 280 FAILED BINDER TRANSACTION 它发生在大尺寸图像上 小尺寸图像运行良好 我该怎
  • 尝试使用实体框架保存大型 xml 时出现“ORA-00932:不一致的数据类型:预期的 NUMBER 获得 NCLOB”错误

    当我尝试使用 ADO NET 实体框架将具有大型 xml 的新记录插入具有 XmlType 列的 oracle 表时 出现以下错误 Oracle DataAccess Client OracleException Message ORA 0
  • 展开 pandas 数据框列中字典的嵌套列表

    我有一个名为 leads 的数据帧 是通过将 SFDC SOQL 的输出保存到数据帧中而得到的 我一直在尝试扩展 Leads r record 列 Company Month Amount Leads r done Leads r reco
  • 使用 ZeroMQ 的 C++ RPC 框架

    我需要使用 ZeroMQ 推拉套接字模式用 C 编写客户端 服务器应用程序 客户端必须对服务器接口中指定的函数进行 RPC 调用 我想知道是否有一个开源且商业可用的库 框架主要用于此目的 主要是 C 我做了一些谷歌搜索 似乎有一些用 pyt
  • Chrome 浏览器 - navigator.language 不返回国家/地区代码

    自最近几个月以来 我在从 window navigator language 检测 CountryCode 时遇到问题 我当前在 Chrome 上的语言是法语 瑞士 目前它仅返回语言 window navigator language fr
  • 通过列索引而不是列名称调用数据框中的列 - pandas

    如何使用数据框中的索引而不是名称来调用代码中的列 例如我有数据框df有柱子a b c 而不是打电话df a 我可以使用它的列索引来调用它吗df 1 您可以使用iloc http pandas pydata org pandas docs v
  • 即使使用代理,Nodejs 也不会为 React CRA 应用程序设置 cookie

    我有一个nodejs express React CRA 应用程序 我正在尝试从nodejs 设置一个cookie 服务器位于端口 4001 因此在我的 React 应用程序的 project json 中我有 proxy http loc
  • 如何制作操作系统启动时启动的启动程序

    假设我有一个 C 程序可以执行某些操作 我希望该程序继续自行运行或在计算机启动时自动开始执行 我怎样才能使这个程序不可检测 即它不能在任务管理器的进程列表中被检测到 假设我有一个在 Windows 窗体上显示随机数的程序 for Rando
  • 为什么scala不进行尾调用优化?

    只是玩延续 目标是创建将接收另一个函数作为参数和执行量的函数 并返回将应用参数给定次数的函数 实现看起来很明显 def n times T func T gt T count Int T gt T tailrec def n times c