복붙노트

[SCALA] 스칼라 : foldLeft 대 배

SCALA

스칼라 : foldLeft 대 배

나는 배 방법을 이해하려고 노력하고 foldLeft와 각각 감소 및 reduceLeft 작업을하고있다. 내 예로 접어 foldLeft 사용

scala> val r = List((ArrayBuffer(1, 2, 3, 4),10))
scala> r.foldLeft(ArrayBuffer(1,2,4,5))((x,y) => x -- y._1)

scala> res28: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(5)

scala> r.fold(ArrayBuffer(1,2,4,5))((x,y) => x -- y._1)
<console>:11: error: value _1 is not a member of Serializable with Equals
              r.fold(ArrayBuffer(1,2,4,5))((x,y) => x -- y._1)

왜 배 foldLeft으로 작동하지 않았다? 같음과 직렬화 무엇입니까? 나는 배 이해하고 foldLeft 파라미터 일반적인 유형의 측면에서 약간 다른 API의 서명이 있습니다. 알려 주시기 바랍니다. 감사.

해결법

  1. ==============================

    1.방법 배 (원래 병렬 계산을 위해 첨가 된)가 적용될 수있다 유형 환산 foldLeft보다 강력하다. 그것의 서명은 다음과 같습니다

    방법 배 (원래 병렬 계산을 위해 첨가 된)가 적용될 수있다 유형 환산 foldLeft보다 강력하다. 그것의 서명은 다음과 같습니다

    def fold[A1 >: A](z: A1)(op: (A1, A1) => A1): A1
    

    폴딩이 수행되는 동안 입력이 보유 수단이 수집 소자 형태의 슈퍼한다.

    def foldLeft[B](z: B)(op: (B, A) => B): B
    

    이유가있는 동안 foldLeft 못해, 배 병렬로 구현 될 수 있다는 것이다. 그것은 단지 요소 타입 A와 집합 타입 B를 조합하는 방법을 정의 -이 아니라 때문에 오른쪽 순차적으로 남아 있지만 작업자 OP가 병렬로 연산 결과를 조합 할 수도 있기로 foldLeft가는 것을 함축 * 왼쪽 부분이며 응집 형 A1은 A1하는 요소 타입 A의 슈퍼이어야하기 때문이지만 유형 B. 두 집합체를 결합하지 않는 방법을 접는 방법은 다시>이 정의 않는다 : A.이 수퍼 타입 ​​관계 허용 동시에 상기 집합과 요소를 접기 및 집계를 결합 - 두 번의 연산자.

    그러나, 응집과 같은 요소 유형하여 예의 응집 형 A1은 (ArrayBuffer [지능, INT)의 퍼되어야한다는 수단 사이의 수퍼 타입 ​​관계. 하여 응집 제로 엘리먼트 (1, 2, 4, 5) 유형 ArrayBuffer [지능]의 ArrayBuffer 때문에, 응집 형이 둘의 수퍼 것으로 추정된다 - 그리고 그 유일한 적어도 equals와 직렬화있어 상단 튜플과 배열 버퍼 바운드.

    당신이 (순서가 이루어집니다) 임의의 유형의 병렬 폴딩을 허용 할 경우 일반적으로 두 개의 집계가 결합하는 방법을 정의 할 필요 메소드 집계를 사용해야합니다. 귀하의 경우 :

    r.aggregate(ArrayBuffer(1, 2, 4, 5))({ (x, y) => x -- y._1 }, (x, y) => x intersect y)
    

    BTW, / reduceLeft을 줄이기로 예를 작성하려고 - 때문에 요소 유형 및이 두 가지 방법이 있다고 집계 유형의 슈퍼 타입 관계, 당신은 당신이 설명한 것과 유사한 오류에 이르게 것을 발견 할 것이다.

  2. from https://stackoverflow.com/questions/16111440/scala-fold-vs-foldleft by cc-by-sa and MIT license