- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想对 initConnection 进行初始调用,它会调用 getData,后者会递归调用自身,直到需要刷新连接 ID,然后再调用 initConnection。
@tailrec private def initConnection(): Unit =
{
val response: Future[Response] = initHeaders(WS.url(url)).post(auth)
response.onSuccess {
case resp => getData(20, resp.asInstanceOf[Response].header("connectionID").get)
}
response.onFailure {
case resp => initConnection()
}
}
@tailrec private def getData(requestsLeft: Int, sessionId: String): Unit =
{
if (requestsLeft == 0)
{
initConnection()
}
else
{
//send request and process data
getData(requestsLeft - 1, sessionId)
}
}
我在 IntelliJ 中收到“递归调用不在尾部位置”错误,仅针对 initConnection 函数。两个函数之间不能使用尾递归吗?还是只与我的 Future[Response] 有关?
我还尝试删除 Future[Response]
@tailrec private def initConnection(): Unit =
{
val response: Response = initHeaders(WS.url(url)).post(auth).value.get.get
getData(20, response.header("ConnectionID").get)
}
并得到一个关于 initConnectioncontaining no recursive calls 的错误。然而这显然是无限递归的
最佳答案
递归是指方法调用自身。直接递归是指方法直接调用自身。 Tail-Call 是在方法中评估的最后一次调用。 Tail-Recursion 是一种递归调用,也是一种 Tail-Call。 Direct Tail-Recursion 是一种直接递归调用,也是一种 Tail-Call。
Scala 只保证优化直接尾递归。这是因为至少有一些 Scala 打算运行的平台(尤其是 JVM)对高级控制流的支持有限。 JVM 只支持内部方法 GOTO
,例如,这意味着为了实现比直接尾递归更强大的东西,你会遇到 Clojure 的设计者 Rich Hickey 解释为的问题:互操作性、性能、高级控制流——选两个。 Scala 的设计者选择了互操作性和性能,而不是适当的尾调用、相互尾递归、尾递归模数缺点或类似的更强大的保证。
[注意:您不能在 JVM 上实现适当的尾调用这一经常重复的咒语是不正确的。 JVM 上有大量 Scheme 实现证明并非如此。 是的是 JVM 规范本身不保证正确的尾调用。但是有实现它们的方法,即:不要使用 JVM 的调用堆栈,实现你自己的。然而,这将使您在性能或 Java Interop 方面付出高昂的代价,可能两者都有。 Scala 的 TailCall
库是另一个如何在 JVM 上实现适当的尾调用的示例:Trampolines。]
在您的第一个版本中 initConnection
, 递归调用不是尾调用,因为计算的最后一个调用是对 response.onFailure
的调用.
在你的第二个版本中 initConnection
,根本没有递归调用,Tail-Call 是getData
.
尾调用本质上等同于GOTO
和尾递归本质上等同于 while
循环(在 JVM 上使用 GOTO
实现)。但是,JVM 的 GOTO
仅适用于 一个方法。因此,如果 Scala 想要实现适当的尾递归,他们要么必须实现自己的堆栈而不使用 JVM,将所有相互递归的方法组合到一个巨大的方法中,这样 GOTO
有效,将异常用作蹦床或做类似的令人讨厌的事情,所有这些都会破坏 Java 互操作性、性能或两者。
由于 JVM 是 Scala 设计人员的重要平台,性能和平台互操作性是重要目标,因此他们宁愿放弃有用的语言功能也不愿放弃强大的平台。在规范中强制使用适当的尾递归将使 Scala 在 2015 年之前的 JVM 或 ECMAScript 等平台上几乎无法实现。 (或者更确切地说,它将禁止高性能、高度互操作的实现。)
关于scala - 两个函数之间的尾递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35121475/
我需要修复 getLineNumberFor 方法,以便如果 lastName 的第一个字符位于 A 和 M 之间,则返回 1;如果它位于 N 和 Z 之间,则返回 2。 在我看来听起来很简单,但我不
您好,感谢您的帮助!我有这个: 0 我必须在每次点击后增加“pinli
Javascript 中是否有一种方法可以在不使用 if 语句的情况下通过 switch case 结构将一个整数与另一个整数进行比较? 例如。 switch(integer) { case
我有一列是“日期”类型的。如何在自定义选项中使用“之间”选项? 最佳答案 请注意,您有2个盒子。 between(在SQL中)包含所有内容,因此将框1设置为:DATE >= startdate,将框2
我有一个表,其中包含年、月和一些数字列 Year Month Total 2011 10 100 2011 11 150 2011 12 100 20
这个问题已经有答案了: Extract a substring between double quotes with regular expression in Java (2 个回答) how to
我有一个带有类别的边栏。正如你在这里看到的:http://kees.een-site-bouwen.nl/ url 中类别的 ID。带有 uri 段(3)当您单击其中一个类别时,例如网页设计。显示了一
这个问题在这里已经有了答案: My regex is matching too much. How do I make it stop? [duplicate] (5 个答案) 关闭 4 年前。 我
我很不会写正则表达式。 我正在尝试获取括号“()”之间的值。像下面这样的东西...... $a = "POLYGON((1 1,2 2,3 3,1 1))"; preg_match_all("/\((
我必须添加一个叠加层 (ImageView),以便它稍微移动到包含布局的左边界的左侧。 执行此操作的最佳方法是什么? 尝试了一些简单的方法,比如将 ImageView 放在布局中并使用负边距 andr
Rx 中是否有一些扩展方法来完成下面的场景? 我有一个开始泵送的值(绿色圆圈)和其他停止泵送的值(簧片圆圈),蓝色圆圈应该是预期值,我不希望这个命令被取消并重新创建(即“TakeUntil”和“Ski
我有一个看起来像这样的数据框(Dataframe X): id number found 1 5225 NA 2 2222 NA 3 3121 NA 我有另一个看起来
所以,我正在尝试制作正则表达式,它将解析存储在对象中的所有全局函数声明,例如,像这样 const a = () => {} 我做了这样的事情: /(?:const|let|var)\s*([A-z0-
我正在尝试从 Intellivision 重新创建 Astro-Smash,我想让桶保持在两个 Angular 之间。我只是想不出在哪里以及如何让这个东西停留在两者之间。 我已经以各种方式交换了函数,
到处检查但找不到答案。 我有这个页面,我使用 INNER JOIN 将两个表连接在一起,获取它们的值并显示它们。我有这个表格,用来获取变量(例如开始日期、结束日期和卡号),这些变量将作为从表中调用值的
我陷入了两个不同的问题/错误之间,无法想出一个合适的解决方案。任何帮助将不胜感激 上下文、FFI 和调用大量 C 函数,并将 C 类型包装在 rust 结构中。 第一个问题是ICE: this pat
我在 MySQL 中有一个用户列表,在订阅时,时间戳是使用 CURRENT_TIMESTAMP 在数据库中设置的。 现在我想从此表中选择订阅日期介于第 X 天和第 Y 天之间的表我尝试了几个查询,但不
我的输入是开始日期和结束日期。我想检查它是在 12 月 1 日到 3 月 31 日之间。(年份可以更改,并且只有在此期间内或之外的日期)。 到目前为止,我还没有找到任何关于 Joda-time 的解决
我正在努力了解线程与 CPU 使用率的关系。有很多关于线程与多处理的讨论(一个很好的概述是 this answer )所以我决定通过在运行 Windows 10、Python 3.4 的 8 CPU
我正在尝试编写 PHP 代码来循环遍历数组以创建 HTML 表格。我一直在尝试做类似的事情: fetchAll(PDO::FETCH_ASSOC); ?>
我是一名优秀的程序员,十分优秀!