2017-02-07 9 views
2

문자열 "Hello"의 유니 코드 제품을 스칼라로 계산하려고했습니다. 그리고 StringOps의 스칼라 API에, 나는 방법 배와 foldLeft을 발견하고 나는 위의 두 방법을 사용하여 일부 코드를 작성 : 제가 정확한 답변을 얻을 수 있습니다Scala에서 StringOps의 fold 메서드를 사용하는 방법?

val s = "Hello" 
s.fold(1L){(z, i) => z*i} 
s.foldLeft(1L){(z, i) => z*i} 

2 식을 사용하여을하지만 첫 번째는 할 수 없습니다 IDE가 "심볼을 해결할 수 없습니다 *"라고 불평하면 누구나 설명 할 수 있습니까?

답변

2

당신이 fold의 유형 서명을 보면 :

fold[A1 >: Char](z: A1)(op: (A1, A1) ⇒ A1): A1 

당신 때문에 당신의 표현이 불가능하게 컴파일러가 오류를 던지고, 그것은 단지 Char S의 슈퍼 타입에 동작하는 것을 확인할 수 있습니다.

foldLeft 그러나 당신이 당신이 당신의 현재 표현을 쓸 수 있습니다 B

foldLeft[B](z: B)(op: (B, Char) ⇒ B): B 

결과 유형을 사용할 수 있습니다. 요약하자면

: foldLeftop 함수의 결과 유형을 기대하면서 fold는 그 종자의 인수로 Char (당신이 당신의 씨앗으로 1L를 제공 할 때 컴파일러가 불평을) 기대하고있다.

업데이트 :

s.fold(1L){(z, i) => z}는 컴파일러에 의해 올바른 것으로 간주됩니다. 이는 CharLong이 상위 유형 AnyVal을 공유하기 때문입니다. fold은 을 제공하는 Char의 수퍼 유형을 예상하므로 작동합니다. 또한 컴파일러가 * 함수를 찾을 수 없다는 불평을하는 이유는 AnyVal 유형에 정의되어 있지 않기 때문입니다.

업데이트 2 :

당신이 정말로 당신이 사전에 서열 [긴]에 s를 매핑해야합니다 fold 대신 foldLeft의 사용합니다. 즉 :

s.map(_.toLong).fold(1L){(z, i) => z*i} //returns 9415087488 
+0

당신은 나에게 예를 적어주세요 수 있습니다하지만 테스트로, 표현 s.fold (1L)는 {(Z, I) => Z}도 정확하고, 종자는 1L, 그리고? 왜 옳지 않은가? – Coinnigh

+0

어떤 종류의 예를보고 싶습니까? –

+0

내 씨앗으로 1L을 제공하면 컴파일러가 불평하지 않고 결과는 1 – Coinnigh

관련 문제