Scala 组合函数会导致堆栈溢出

Scala 组合函数会导致堆栈溢出,scala,Scala,列出了以下示例,以说明组合函数如何导致堆栈溢出错误 scala> val f = (x: Int) => x f: Int => Int = <function1> scala> val g = List.fill(100000)(f).foldLeft(f)(_ compose _) g: Int => Int = <function1> scala> g(42) java.lang.StackOverflowError sca

列出了以下示例,以说明组合函数如何导致堆栈溢出错误

scala> val f = (x: Int) => x
f: Int => Int = <function1>

scala> val g = List.fill(100000)(f).foldLeft(f)(_ compose _)
g: Int => Int = <function1>

scala> g(42)
java.lang.StackOverflowError
scala>valf=(x:Int)=>x
f:Int=>Int=
scala>valg=List.fill(100000)(f).foldLeft(f)(组合)
g:Int=>Int=
scala>g(42)
栈溢出
正如这本书所解释的,
g
是一个复合函数,它有100000个函数,每个函数调用下一个函数

既然
foldLeft
是尾部递归的,为什么会发生StackOverflower错误?尾部递归和StackOverflow有什么关系


当(扩展后)foldLeft的第二个参数
(B,A)=>B
((acc,elem)=>acc.compose(elem))
时,不是每个折叠步骤只生成两个函数吗?

这不是因为
foldLeft
compose
本身。这是因为
g(x)=f(f(f(…(x))

既然foldLeft是尾部递归的,为什么会出现这种StackOverflower错误?如果有的话,尾部递归和StackOverflow有什么关系

当(展开时)foldLeft的第二个参数(B,A)=>B,((acc,elem)=>acc.compose(elem)),每个折叠步骤不是只合成两个函数吗

请注意,折叠本身(即行
val g=…
)不会溢出堆栈。但是,
g
最终被有效地定义为
f(f(…(x))
,因此需要100000个堆栈帧来计算
g(42)
,这显然会溢出