4

저는 함수형 프로그래밍과 스칼라를 배우려고합니다. 그래서 Chiusano와 Bjarnason의 "Functional Programming in Scala"를 읽었습니다. 목록의 경우 왼쪽 접기와 오른쪽 방법을 이해하는 데 문제가 있습니다. 나는 여기를 둘러 보았지만 친근한 초보자를 찾지 못했습니다. 그래서이 책에서 제공하는 코드는 다음과 같습니다 단점과 무기 호는Scala fold right와 fold left

def foldRight[A,B](as: List[A], z: B)(f: (A, B) => B): B = as match { 
    case Nil => z 
    case Cons(h, t) => f(h, foldRight(t, z)(f)) 
} 

def foldLeft[A,B](l: List[A], z: B)(f: (B, A) => B): B = l match { 
    case Nil => z 
    case Cons(h,t) => foldLeft(t, f(z,h))(f) 
} 

는 :

그래서
case class Cons[+A](head: A, tail: List[A]) extends List[A] 
case object Nil extends List[Nothing] 

실제로 왼쪽 폴드 옳은 일을해야합니까? 왜 "유틸리티"방법으로 필요합니까? 그 (것)들을 이용하는 다른 많은 방법이 있고 나는 그 (것)들을 얻지 않기 때문에, 또한 그 (것)들을 이해하는 말썽이있다.

+0

다음 스레드를 살펴보십시오. http://stackoverflow.com/questions/24370549/foldleft-v-foldright-does-it-matter 이러한 작업과 관련된 많은 정보가 있습니다. 나에게 중복되는 것처럼 보입니다. – Pavel

+0

그 질문에 사용자가 물어 보는 것은 당면한 문제에 대해 꽤 잘 이해하고있는 것으로 보입니다. 나는 도움이되지 못합니다. – jrsall92

+2

제공하신 코드. 특별한 질문이 있습니까? 정확하게 어려움을 만드는 것은 무엇입니까? 구문? 차이점을 이해하는 열쇠는 두 경우 모두 재귀 호출 방식입니다. 그것은 다르다. 꼬리 재귀에 대해 읽어보십시오. 희망이 도움이 될 것입니다. More links : https://oldfashionedsoftware.com/2009/07/10/scala-code-review-foldleft-and-foldright/ – Pavel

답변

7

내 경험, 직관 그것은 매우 간단한 예제에서 작동 방식을 볼 수 있습니다 운동을하는 가장 좋은 방법 중 하나에 따르면

List(1, 3, 8).foldLeft(100)(_ - _) == ((100 - 1) - 3) - 8 == 88 
List(1, 3, 8).foldRight(100)(_ - _) == 1 - (3 - (8 - 100)) == -94 

당신이 볼 수 있듯이, foldLeft/Right는리스트의 요소를 전달 및 두 번째 괄호 안에 연산에 대한 이전 응용의 결과. 이러한 메서드를 같은 목록에 적용하면 적용된 연산이 연관성이있는 경우에만 동일한 결과가 반환된다는 점도 언급해야합니다.

+0

나는 당신의 작업이 '(_ - _)', 즉 플러스 대신 마이너스 인 것을 의미한다고 생각합니다. 그렇지 않으면 foldLeft와 foldRight의 차이에 대한 아주 좋은 설명. – melston

1

숫자 목록이 있고 모두 추가하고 싶다고합시다. 어떻게 그럴 수 있니? 첫 번째와 두 번째를 추가 한 다음 그 결과를 가져 와서 세 번째에 추가하고 그 결과를 네 번째에 추가합니다.

그건 네가하는 일이다.

List(1,2,3,4,5).foldLeft(0)(_ + _) 

은 "+"첫 번째 피연산자 원경 요소에의 응용의 결과 인, 두 번째 오퍼랜드는 다음 요소로되고, 적용 할 함수이다. 첫 번째 응용 프로그램에 대해 "지금까지의 결과"가 없으므로 시작 값을 제공합니다 (이 경우 0은 추가를위한 식별 요소이기 때문에).

당신이 배와 함께, 목록의 모든 요소를 ​​곱하고 싶은 말은, 그 것

List(1,2,3,4,5).foldLeft(1)(_ * _) 

폴드는 검사 할 수 Wikipedia page 자신의있다.

물론 foldLeftfoldRight에 대한 ScalaDoc 항목이 있습니다.