당신이 fold
의 유형 서명을 보면 :
fold[A1 >: Char](z: A1)(op: (A1, A1) ⇒ A1): A1
당신 때문에 당신의 표현이 불가능하게 컴파일러가 오류를 던지고, 그것은 단지 Char
S의 슈퍼 타입에 동작하는 것을 확인할 수 있습니다.
foldLeft
그러나 당신이 당신이 당신의 현재 표현을 쓸 수 있습니다 B
foldLeft[B](z: B)(op: (B, Char) ⇒ B): B
결과 유형을 사용할 수 있습니다. 요약하자면
: foldLeft
이 op
함수의 결과 유형을 기대하면서 fold
는 그 종자의 인수로 Char
(당신이 당신의 씨앗으로 1L
를 제공 할 때 컴파일러가 불평을) 기대하고있다.
업데이트 :
s.fold(1L){(z, i) => z}
는 컴파일러에 의해 올바른 것으로 간주됩니다. 이는 Char
및 Long
이 상위 유형 AnyVal
을 공유하기 때문입니다. fold
은 을 제공하는 Char
의 수퍼 유형을 예상하므로 작동합니다. 또한 컴파일러가 *
함수를 찾을 수 없다는 불평을하는 이유는 AnyVal
유형에 정의되어 있지 않기 때문입니다.
업데이트 2 :
당신이 정말로 당신이 사전에 서열 [긴]에 s
를 매핑해야합니다 fold
대신 foldLeft
의 사용합니다. 즉 :
s.map(_.toLong).fold(1L){(z, i) => z*i} //returns 9415087488
당신은 나에게 예를 적어주세요 수 있습니다하지만 테스트로, 표현 s.fold (1L)는 {(Z, I) => Z}도 정확하고, 종자는 1L, 그리고? 왜 옳지 않은가? – Coinnigh
어떤 종류의 예를보고 싶습니까? –
내 씨앗으로 1L을 제공하면 컴파일러가 불평하지 않고 결과는 1 – Coinnigh