Scala while 循环一直返回 Unit

标签 scala while-loop

我有以下代码,但我无法让它工作。只要我在 case 中放置一个 while 循环,它就会返回一个单位,无论我在括号内进行什么更改。

case While(c, body) =>
    while (true) {
      eval(Num(1))
    }
}

如何让这个 while 循环返回一个非 Unit 类型?

我试过了 adding brackets around my while condition , 但它仍然没有做它应该做的事。

有什么建议吗?

更新

多一点背景信息,因为我没有真正解释代码应该做什么,如果我想获得一些帮助,这似乎很方便;

我定义了一个eval(exp : Exp)。这将评估一个功能。 Exp 是一个抽象类。由几个类扩展,如 PlusMinus(一些更基本的操作)和一个 IfThenElse(cond : Exp, then : Exp, else : Exp)。最后但同样重要的是,While(cond: Exp, body: Exp)

应该如何使用的例子;

eval(Plus(Num(1),Num(4)) 将产生 NumValue(5)。(Num(v : Value) 的计算结果为NumValue(v).NumValue extends Value,这是另一个抽象类)。

eval(While(Lt(Num(1),Var("n")), Plus(Num(1), Var("n"))))

Lt(a : Exp, b : Exp) 返回 NumValue(1) 如果 a < b。

最佳答案

从另一个答案可以清楚地看出,Scala while 循环总是返回 Unit。 Scala 的优点在于,如果它不能满足您的要求,您可以随时对其进行扩展。

下面是一个类似于 while 的构造的定义,它返回最后一次迭代的结果(如果从未进入循环,它将抛出异常):

def whiley[T](cond : =>Boolean)(body : =>T) : T = {
  @scala.annotation.tailrec
  def loop(previous : T) : T = if(cond) loop(body) else previous
  if(cond) loop(body) else throw new Exception("Loop must be entered at least once.")
}

...然后您可以将其用作while。 (事实上​​,@tailrec 注释将使它编译成与 while 循环完全相同的东西。)

var x = 10
val atExit = whiley(x > 0) {
  val squared = x * x
  println(x)
  x -= 1
  squared
}
println("The last time x was printed, its square was : " + atExit)

(请注意,我并不是说该构造很有用。)

关于Scala while 循环一直返回 Unit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9785965/

相关文章:

c - While 循环条件不满足

scala - 'MyType = Int => Boolean'是什么意思

linux - Activator Active Stocks 入门应用程序无法运行并出现 java.io.IOException?

scala - 使用 monoid 进行 Spark 分布式计算的示例

java - While 循环中递减运算符的问题

java - While 循环无法正常工作。 ArrayIndexOutOfBoundsException

java - 如果里面 while

scala - 将字符串转换为映射

scala - sbt heapsize 不够?

php - 从数据库中选择不工作