2017-02-28 1 views
5

온라인 과정에서 foldLeftfoldRight은 연산자가 이고 연관이 인 것과 같습니다.foldReft에 해당하는 foldRight는 비 호환 연결 작업을 제공합니까?

학생 중 한 명은 그러한 연산자가 연관성이 있어야한다고 단언합니다. 따라서이 속성은 함수 구성 및 행렬 곱셈과 같은 연산에 대해 true 여야합니다.

한국인 z 중성이며 동작 피연산자의 순서가 그대로 유지되도록하는 방식으로 축적되지 않는 난 foldLeftfoldRight 대해 동등한 결과를 생성하지 않을 것이다 가환 아닌 연관 동작을 알 수있다. IMO는 일반적인 경우에 조작이 교환 가능해야합니다.

list.foldLeft(z)(operation) == list.foldRight(z)(operation) 

그래서, foldLeftfoldRight에 대한 operation 동시에 결합과 교환 법칙이 성립해야한다 동등하거나이 operation 충분한 연관 될 수있다?

답변

4

이 함수는 교환 가능하고 연관성이 있어야합니다.

우리의 기능은 f이며, 우리의 요소는, x1x4에있는 경우 :

foldLeft가 f(f(f(x1, x2), x3), x4)

foldRight입니다 f(x1, f(x2, f(x3, x4)))

의이 교환 법칙이 성립하지만 연관되지 않습니다 평균 함수를 사용하자 ((a + b)/2 == (b + a)/2) :

scala> def avg(a: Double, b: Double): Double = (a + b)/2 
avg: (a: Double, b: Double)Double 

scala> (0 until 10).map(_.toDouble).foldLeft(0d)(avg) 
res4: Double = 8.001953125 

scala> (0 until 10).map(_.toDouble).foldRight(0d)(avg) 
res5: Double = 0.9892578125 

편집 : 보트를 놓친 것만 연관성 대 교환 가능합니다. @ jwvy의 연관성은 있지만 교환 가능하지 않은 함수의 문자열 연결 예제를 참조하십시오.

+0

좋은 캐치. @ jwvh의 문자열 연결을 참조합니다. – Tim

7

String 연결 ("ABC"+ "XYZ")는 결합하지만 가환되지이고 foldLeft/foldRight 결과 스트링들의 대향 단부에서의 초기/제로 소자를 배치한다. 그 0 요소가 빈 문자열이 아니면 결과가 다릅니다.

4

foldLeft는 (...(z op x1)... op xn) foldRight이 두 사람은 일반적인 경우에 해당 될 때까지 교환 법칙과 결합 될 x1 op (x2 op (... xn op z)...) 그래서 op 요구입니다

1

이 별도의 답변 적어도 세 관련 사례입니다

  1. op: (B, A) -> B 또는 op: (A, B) -> B의 경우, foldLeftfoldRight의 서명과 같이, 결합 성 또는 교환 가능 성은 한정된.

  2. B >: Az 경우 op: (B, B) -> Bop의 양면 신원이다 L.foldRight(z)(op) 같은 결과를 L.foldLeft(z)(op)List[A] 모든 L 위해 다음 연관이다.

    이 밀접하게 op이 유형의 모든 L를 들어, 연관 경우 다음 B >: Aop: (B, B) -> B 경우, List[A]L.reduceLeft(op)L.reduceRight(op) 같은 결과를 사실과 관련이 있습니다.

  3. B >: A하는 경우, 그리고 op: (B, B) -> BL.foldLeft(z)(op)L.foldRight(z)(op)와 같은 결과를 반환 연관 및 모든 유형 List[A]L 및 유형 Bz에 대한 다음 교환 법칙이 성립 모두이다.