Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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 for/yield循环与java for循环(初始标题“递归值XXX需要类型”,尽管类型已经说明)_Scala_For Loop_Types_Iteration_Yield - Fatal编程技术网

scala for/yield循环与java for循环(初始标题“递归值XXX需要类型”,尽管类型已经说明)

scala for/yield循环与java for循环(初始标题“递归值XXX需要类型”,尽管类型已经说明),scala,for-loop,types,iteration,yield,Scala,For Loop,Types,Iteration,Yield,我是斯卡拉的新手。温柔点。我想在scala中使用for/yield做一些非常基本的事情。这段代码在Java中的等价物是什么: int somme = 0 for (int i = 1; i < 11 ; i++ ) somme = somme + i int-somme=0 对于(int i=1;i,它不携带任何有意义的信息,只浪费内存。@ AndreyTyukin,即使它是Python,使用收益率仍然会产生一个序列。@ Sepp2k要么我不明白你的意思,要么:不,它不会。考虑

我是斯卡拉的新手。温柔点。我想在scala中使用for/yield做一些非常基本的事情。这段代码在Java中的等价物是什么:

int somme = 0
for (int i = 1; i < 11 ; i++ ) 
    somme = somme + i
int-somme=0
对于(int i=1;i<11;i++)
somme=somme+i
在斯卡拉

var somme: Int = 0    
for {
  i <- 1 to 10
  somme = somme  + i
} yield somme
var-somme:Int=0
为了{

在scala中使用var不是一个好主意,因为它是可变的

您可以轻松做到这一点:

  val somme = (1 to 10).sum
但如果您真的想使用var,并且为了理解这一点:

var somme: Int = 0
  for {
    i <- 1 to 10
  } yield {
    somme = somme + i
  }
println(somme)
var-somme:Int=0
为了{

i您不需要使用收益率。等价物可能如下:

var somme: Int = 0    

for(i <- 1 to 10 ){
  somme = somme + i
}
(1 to 10) reduce {_ + _}
//=> res: Int = 55
var-somme:Int=0

Scala中的for(i
for
foreach
map
flatMap
with filter
的语法糖。它实际上根本不是一个循环

for
without
yield
foreach
的语法糖,因此大致相当于(var-el:collection)
循环的Java“增强的”

Scala中Java
for
循环的等价物实际上是
while
循环,因为这是Scala唯一的循环类型:

var somme = 0
var i = 1

while (i < 11) { 
  somme += i
  i += 1
}
这是语法糖

var somme = 0
(1 to 10) foreach { i ⇒ somme += i }
这大致相当于以下Java代码:

var somme = 0;
for (var i : java.util.stream.IntStream.range(1, 11)) somme += i;
但是,请注意,这不是在Scala中编写代码的方式(实际上也不是在现代Java中)

var somme: Int = 0    

for(i <- 1 to 10 ){
  somme = somme + i
}
(1 to 10) reduce {_ + _}
//=> res: Int = 55
在这种情况下:

(1 to 10).sum
//=> res: Int = 55
这相当于您在现代Java中的编写方式:

java.util.stream.IntStream.range(1, 11).reduce((a, b) -> a + b)


你到底想做什么?在scala中使用for/yield将int的和从1到10。我想使用for/yield。你希望结果是一个序列还是一个整数?你的Java代码只生成一个整数,但是你的scala版本,如果它真的像你希望的那样工作,会生成一个序列。它不是
(1到11)
.I have change.Good.但是第二个代码片段中的
yield{()}
仍然是奇怪和误导的。而且,第二个解决方案使用了O(n)空间。O(n)时间已经够糟糕了(因为结果可以通过O(1)中的显式公式计算),但是O(n)空间实在是太不必要了……感谢你对收益率@Andreytytukini的以下解释。我会将“你不需要”改为“你不能”,因为这里没有办法对收益率有意义地使用
。哦,好吧。我是不是错过了“收益率”的要点?“收益率”就像“回报率”。为什么我不能在循环中计算somme之后返回它呢?@user3600237 A
for/yield
用于从1到10的序列会产生一个长度为10的序列。但是你想要一个和,它是一个单一的数字。单一的数字不是一个序列。因此,你不能使用
for yield
来实现这一点。它不是python,
yield
在n中o方式“like
return
”。如果在上述
for
-循环中添加一个
yield
,它将生成一个包含10个元素的无用数据结构
()
,类似于
列表((),(),(),(),(),(),,(),,(),(),(),())< /代码>,它不携带任何有意义的信息,只浪费内存。@ AndreyTyukin,即使它是Python,使用<代码>收益率<代码>仍然会产生一个序列。@ Sepp2k要么我不明白你的意思,要么:不,它不会。考虑可中断的生成器函数<代码> DEF():对于i的范围(1, 11):yield i
。现在调用
sum(foo())
范围(1,11)
本质上只是一个包含两个数字的元组,它占用常量空间。整个挂起的
foo
协同路由也占用常量空间。它在任何时候都不会创建任何占用O(n)空间的数据结构。但是对于(i)您的Java流示例在增强的
示例中有一个额外的近距离paren.Cut&Paste错误。谢谢!
java.util.stream.IntStream.range(1, 11).sum()