相关疑难解决方法(0)

在Scala中定义函数的这三种方式之间的差异

给出了表达相同功能的三种方式f(a) := a + 1:

val f1 = (a:Int) => a + 1
def f2 = (a:Int) => a + 1
def f3:(Int => Int) = a => a + 1
Run Code Online (Sandbox Code Playgroud)

这些定义有何不同?REPL没有表明任何明显的差异:

scala> f1
res38: (Int) => Int = <function1>
scala> f2
res39: (Int) => Int = <function1>
scala> f3
res40: (Int) => Int = <function1>
Run Code Online (Sandbox Code Playgroud)

scala

92
推荐指数
2
解决办法
2万
查看次数

Scala流的功能处理没有OutOfMemory错误

是否可以将函数式编程应用于Scala流,以便顺序处理流,但流的已处理部分可以被垃圾收集?

例如,我定义了一个Stream包含从数字startend:

def fromToStream(start: Int, end: Int) : Stream[Int] = {
  if (end < start) Stream.empty
  else start #:: fromToStream(start+1, end)
}
Run Code Online (Sandbox Code Playgroud)

如果我以函数式总结值:

println(fromToStream(1,10000000).reduceLeft(_+_))
Run Code Online (Sandbox Code Playgroud)

我得到一个OutOfMemoryError- 也许是因为调用的堆栈帧reduceLeft保存了对流的头部的引用.但如果我以迭代方式执行此操作,它的工作原理如下:

var sum = 0
for (i <- fromToStream(1,10000000)) {
  sum += i
}
Run Code Online (Sandbox Code Playgroud)

有没有办法以功能的方式做到这一点而没有得到OutOfMemory

更新:这是scala中的一个错误,现在已修复.所以这或多或少已经过时了.

functional-programming scala

20
推荐指数
2
解决办法
3433
查看次数

标签 统计

scala ×2

functional-programming ×1