여기서 작성자는 List에 정의 된 것과 같이 scala 표준 라이브러리의 foldRight 정의를 언급하지 않는다는 점에 유의하십시오. 그들은 3.4 절에서 위에 주어진 foldRight의 정의를 언급하고 있습니다.
스칼라 표준 라이브러리는 목록을 역전 (스택 공간에서 수행 할 수 있음) 한 다음 foldLeft를 foldLeft로 정의한 다음 전달 된 함수의 인수를 반대로하여 foldLeft를 호출합니다. 이 목록에 대한 작동하지만, 예를 들어, 안전하게 되돌릴 수 없습니다 구조에 대해 작동하지 않습니다 :
Stream.continually(false).foldRight(true)(_ && _)
:
scala> Stream.continually(false)
res0: scala.collection.immutable.Stream[Boolean] = Stream(false, ?)
scala> res0.reverse
java.lang.OutOfMemoryError: GC overhead limit exceeded
이제 가이 작업의 결과 일해야하는지에 대해 생각 할 수 있습니다
대답은 거짓이어야합니다. 스트림에 얼마나 많은 거짓 값이 있는지는 중요하지 않습니다. 무한 값이면 연결을 사용하여 연결하면 false가됩니다. 물론
하스켈은 문제없이이 문제를 가져옵니다
Prelude> foldr (&&) True (repeat False)
False
그리고 그 때문에 두 가지 중요한 것들입니다 : 하스켈의 foldr은 오른쪽에서 왼쪽으로하지, 왼쪽에서 오른쪽으로 스트림을 통과하며, 하스켈에서 게으른 태만. 첫 번째 항목은 foldr이 실제로 왼쪽에서 오른쪽으로 목록을 가로 지르며 오른쪽 접기를 오른쪽에서 시작하는 것으로 생각하는 사람들을 놀라게하거나 혼란스럽게 할 수 있지만 오른쪽 접기의 중요한 특징은 시작하는 구조의 끝이 아니라는 것입니다 에, 그러나 어떤 방향으로 연관성이있다. 그래서 목록 [1,2,3,4]와 op
라는 이름의 연산, 왼쪽 배는
((1 op 2) op 3) op 4)
하고 오른쪽 배는
(1 op (2 op (3 op 4)))
입니다 그러나 평가의 순서가 안 제공 문제. 따라서 제 3 장에서 저자가 왼쪽에서 오른쪽으로 목록을 가로 지르는 접미사를 제공하는 것입니다. 그러나 스칼라가 기본적으로 엄격하기 때문에 우리는 여전히 우리의 무한한 거짓의 흐름을 가로지를 수 없지만, 인내, 그들은 5 장에서 그것에 도달 할 것입니다 :) 나는 표준 라이브러리에 정의 된 foldRight와 scalaz의 Foldable typeclass에서 정의 된대로 차이점을 살펴볼 것입니다.
: scalaz의 접이식에서 정의 여기
def foldRight[B](z: B)(op: (A, B) => B): B
것 :
다음은 스칼라 표준 라이브러리의 구현입니다
의 차이는 우리가 두 번째 매개 변수를 충분히 게으른 기능 제공으로, 기지국이 모든 게으른, 그리고 지금 우리가 다시 우리의 무한 스트림을 접을 수 있다는 것입니다 : 쉽게
scala> Foldable[Stream].foldRight(Stream.continually(false),true)(_ && _)
res0: Boolean = false
하스켈의 'foldr'은 꼬리 재귀가 아니므로 오버플로 오류가 계속 발생하기 쉽습니다. Haskell의 다른 점은'foldr '이 접는 연산자의 양쪽 인수를 평가하지 못하게하는 lazy evaluation의 의미이다. 더 자세한 것은 여기에서 : http://www.haskell.org/haskellwiki/Stack_overflow –
또한 스칼라의 내장 된'foldRight' 메쏘드는 역순으로 스택 오버플로하는 경향이 없습니다. (더 이상) 역순으로리스트에서'foldLeft'를 호출하고, 'foldLeft'는 재귀 적이 아닙니다. https://github.com/scala/scala/blob/v2.11.2/src/library/scala/collection/immutable/List.scala#L396-L397 https://github.com/scala/scala/blob/v2 .11.2/src/library/scala/collection/LinearSeqOptimized.scala # L105-L114 –
오래된 스칼라의'foldRight' 티켓 : https://issues.scala-lang.org/browse/SI-3295 –