Functional Programming in Scala列出以下示例以瞭解撰寫功能如何導致StackOverflowError
。撰寫功能導致StackOverflow
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
正如書中解釋說,g
是擁有10萬層的功能,其中每一個調用下一個複合函數。
由於foldLeft
是尾遞歸,爲什麼這個StackOverflowError發生?如果有的話,tail-recursion和StackOverflow的相關性如何?
當(因爲它擴大了)第二個參數(B, A) => B
的foldLeft
,((acc, elem) => acc.compose(elem))
,是否每個摺疊步驟都不會導致只編寫2個函數?