我尝试从这里运行一个示例:http://www.scala-lang.org/files/archive/nightly/docs/library/index.html#scala.util.control.TailCalls $
scala> import scala.util.control.TailCalls._
import scala.util.control.TailCalls._
scala> def isEven(xs: List[Int]): TailRec[Boolean] =
| if (xs.isEmpty) done(true) else tailcall(isOdd(xs.tail))
<console>:14: error: not found: value isOdd
if (xs.isEmpty) done(true) else tailcall(isOdd(xs.tail))
^
scala>
scala> def isOdd(xs: List[Int]): TailRec[Boolean] =
| if (xs.isEmpty) done(false) else tailcall(isEven(xs.tail))
<console>:14: error: not found: value isEven
if (xs.isEmpty) done(false) else tailcall(isEven(xs.tail))
^
scala>
scala> isEven((1 to 100000).toList).result
<console>:14: error: not found: value isEven
isEven((1 to 100000).toList).result
问题是什么?
答案 0 :(得分:3)
在REPL中使用:paste
定义尾调用并使用Control + D完成编辑,
scala> :paste
// Entering paste mode (ctrl-D to finish)
import scala.util.control.TailCalls._
def isEven(xs: List[Int]): TailRec[Boolean] = if (xs.isEmpty) done(true) else tailcall(isOdd(xs.tail))
def isOdd(xs: List[Int]): TailRec[Boolean] = if (xs.isEmpty) done(false) else tailcall(isEven(xs.tail))
// Exiting paste mode, now interpreting.
import scala.util.control.TailCalls._
isEven: (xs: List[Int])util.control.TailCalls.TailRec[Boolean]
isOdd: (xs: List[Int])util.control.TailCalls.TailRec[Boolean]
这样REPL 等待一次解析所有定义,即isEven
和isOdd
被解析为TailRec
相互递归。
答案 1 :(得分:2)
这是因为您正在尝试使用尚未定义的函数。如果要使用REPL,可以将所有内容包装在对象中或使用&#34;粘贴模式&#34;正如另一个答案所解释的那样:
appProject