gpt4 book ai didi

Scala while 循环一直返回 Unit

转载 作者:行者123 更新时间:2023-12-01 14:45:01 26 4
gpt4 key购买 nike

我有以下代码,但我无法让它工作。只要我在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com