错误:未找到:值isEven和错误:未找到:值isOdd

时间:2015-09-22 08:34:39

标签: scala

我尝试从这里运行一个示例: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

问题是什么?

2 个答案:

答案 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 等待一次解析所有定义,即isEvenisOdd被解析为TailRec相互递归。

答案 1 :(得分:2)

这是因为您正在尝试使用尚未定义的函数。如果要使用REPL,可以将所有内容包装在对象中或使用&#34;粘贴模式&#34;正如另一个答案所解释的那样:

appProject