스칼라 컴파일러가 왜 내 결합 자 함수 유형을 유추 할 수 없는지 궁금합니다. 코드는 다음과 같습니다왜 스칼라 컴파일러가 컨텍스트에서 함수 유형을 추론 할 수 없습니까?
object WordsCount extends App {
import java.io.File
import scala.io.Source.fromFile
type CombinerType = (((String, Int), (String, Int)) => ((String, Int)))
val src = fromFile(new File("/Users/finkel/test/src/main/resources/words.txt"))
var mapped: Iterator[(String, Int)] = src getLines() flatMap { _.split(" ") } map { (_,1) }
val combiner: CombinerType = {
case ((a, b), (c, d)) => ("_", b + d)
}
val wordsAmount = mapped.reduce(combiner)._2
println(wordsAmount)
}
제가 알기로, 컴파일러에 결합기 유형이 기능이라고 알려야합니다. 그 컴파일러가 없다면 말하십시오
Error:(16, 18) missing parameter type for expanded function
The argument types of an anonymous function must be fully known. (SLS 8.5)
Expected type was: ?
val combiner = {
^
그러나 나는 여기서 한 순간을 이해하지 못합니다. Combiner 유형을 추론하는 것이 어렵습니까?
꽤 힘들어 보이네요. 네가 어떻게 생각하는지 쉽게 알 수 없다. 'a'는 어떤 유형이어야하며 그 이유는 무엇입니까? 그 문제에 대해서'b' ... 잠깐, 어쩌면 당신의 혼란이 어디인지 알 수 있습니다. 'val'을 생성 할 때 그것을'reduce'로 전달한다는 것을 모릅니다. – Dima
예, 다음과 같이 작성할 수 있습니다 :'val wordsAmount = src.getLines(). flatMap (_. split ("")) map ((_, 1)). reduce ({case ((a, b) , (c, d)) => ("_", b + d)}) ._ 2'와 같은 오류가 발생합니다. – Finkelson
좋아, 그럼 나도 몰라. 그러나 이것을 질문에 넣어야합니다. 그것이 쓰여지는 방식으로, 왜 그것이 컴파일되지 않아야하는지 분명합니다. – Dima