Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala while循环始终返回单位_Scala_While Loop - Fatal编程技术网

Scala while循环始终返回单位

Scala while循环始终返回单位,scala,while-loop,Scala,While Loop,我有下面的代码,但我不能让它工作。只要我在盒子里放一个while循环,它就会返回一个单位,不管我在括号里做了什么改变 case While(c, body) => while (true) { eval(Num(1)) } } 如何使while循环返回非单位类型 我试过了,但还是没有达到预期的效果 有什么建议吗 更新 更多的背景信息,因为我没有真正解释代码应该做什么,如果我想得到一些帮助,这似乎很方便 我已经定义了一个eval(exp:exp)。这将评估一个函

我有下面的代码,但我不能让它工作。只要我在盒子里放一个while循环,它就会返回一个单位,不管我在括号里做了什么改变

case While(c, body) =>
    while (true) {
      eval(Num(1))
    }
}
如何使while循环返回非单位类型

我试过了,但还是没有达到预期的效果

有什么建议吗

更新

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

我已经定义了一个
eval(exp:exp)
。这将评估一个函数。
Exp
是一个抽象类。通过几个类进行扩展,如
加号
减号
(几个更基本的操作)和
IfThenElse(cond:Exp,then:Exp,else:Exp)
。最后但并非最不重要的是,
While(cond:Exp,body:Exp)

应如何使用的示例

eval(加上(Num(1),Num(4))
将导致
NumValue(5)
(Num(v:Value)的计算将导致NumValue(v)。NumValue扩展Value,后者是另一个抽象类)


Lt(a:Exp,b:Exp)
返回
NumValue(1)
如果awhile循环的唯一目的是执行副作用。或者换句话说,它总是按单位计算


如果您想要返回有意义的东西,为什么不考虑使用if if表达式或表达式?

您希望这个循环返回哪个?如果您想要所有迭代结果的<代码> SEQ < /代码>,请使用<代码> < < /Cord>表达式(也称为<代码> < /COD>理解)。如果只需要最后一个,请在循环外部创建一个
var
,在每次迭代时设置其值,并在循环后返回该
var
。(还要研究在不同类型的集合上作为函数实现的其他循环构造,如
foldLeft
foldRight
,它们在返回值方面有自己有趣的行为。)Scala
while
循环返回
Unit
,因为这个问题没有一个合理的万能答案


(顺便说一句,编译器无法知道这一点,但是您编写的循环将永远不会返回。如果编译器理论上足够聪明,能够理解
而(true)
永远不会终止,那么预期的返回类型将是
Nothing

正如其他人和他们的母亲所说,而循环在Scala中不返回值。似乎没有人提到这是有原因的:性能

返回值会对性能产生影响,因此编译器必须对您何时需要返回值以及何时不需要返回值保持智能。有些情况下,这可以很简单地完成,但也有一些复杂的情况。编译器必须更智能,这意味着它将更慢、更复杂。成本被认为是不可能的这不值得


现在,Scala中有两个循环构造(所有其他构造都基于这两个):while循环和递归。Scala可以优化尾部递归,其结果通常比while循环快。或者,您可以使用while循环并通过副作用返回结果。

另一个答案可能很清楚,Scala
while
循环总是返回
单位它不能做你想做的,你可以随时扩展它

以下是返回上一次迭代结果的类
while
构造的定义(如果从未输入循环,它将抛出异常):

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


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

While和do-While在scala中没有返回值。我不确定这个循环要去哪里。While循环不仅永远不会返回值,而且你的While循环也永远不会返回(除非发生异常).您想返回什么?@thoredge如下所述,“真实”条件用于测试目的我希望我上面的解释能让你更清楚地了解我在做什么。谢谢。我不知道你的编辑给这个问题增加了什么。你还没有解释你想让循环返回什么。我知道一个while循环本身除了单位之外不应该返回任何东西。但是,我更新了我的初始帖子,我希望这能澄清我的问题有点奇怪。无论如何谢谢!@KenBloom好吧,我没有以前讨论过的关于这个问题的链接,我可能会把while循环和wrt性能问题混为一谈。但是,Scala只有两个循环结构很容易验证。我想说while循环不返回值,因为它们在语义上没有值;performNCE与此无关。你可以说while循环返回每个迭代的值序列,但那只是for循环。你可以说它返回上一次迭代的值,但是while循环可以执行0次,所以它最多只能是一个选项。你可以使用while循环重复计算一些代码,这意味着您这样做是为了代码的副作用。返回任何值都会很笨拙,并且与程序员使用它们的原因不一致。while(true)这只是一个测试,看看我的状态评估中是否有错误。但由于错误仍然存在。还有另一个错误,我正在尝试查找/理解。另请参阅初始帖子中的更新。谢谢。很有趣。我花了几次尝试来了解尸体是如何被执行的。就我个人而言,我会在我oop在内部使用
var
while
循环,以便更清晰地阅读。这个答案实际上让我犯了错误
eval(While(Lt(Num(1),Var("n")), Plus(Num(1), Var("n"))))
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.")
}
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)