2016-07-13 3 views
0

스칼라 컴파일러가 왜 내 결합 자 함수 유형을 유추 할 수 없는지 궁금합니다. 코드는 다음과 같습니다왜 스칼라 컴파일러가 컨텍스트에서 함수 유형을 추론 할 수 없습니까?

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 유형을 추론하는 것이 어렵습니까?

+0

꽤 힘들어 보이네요. 네가 어떻게 생각하는지 쉽게 알 수 없다. 'a'는 어떤 유형이어야하며 그 이유는 무엇입니까? 그 문제에 대해서'b' ... 잠깐, 어쩌면 당신의 혼란이 어디인지 알 수 있습니다. 'val'을 생성 할 때 그것을'reduce'로 전달한다는 것을 모릅니다. – Dima

+0

예, 다음과 같이 작성할 수 있습니다 :'val wordsAmount = src.getLines(). flatMap (_. split ("")) map ((_, 1)). reduce ({case ((a, b) , (c, d)) => ("_", b + d)}) ._ 2'와 같은 오류가 발생합니다. – Finkelson

+0

좋아, 그럼 나도 몰라. 그러나 이것을 질문에 넣어야합니다. 그것이 쓰여지는 방식으로, 왜 그것이 컴파일되지 않아야하는지 분명합니다. – Dima

답변

0

인터프리터는 combiner이 기대 수익률 (a, b, cd이 알고있는 모든 것을 할 수 있음)해야 어떤 종류의 아무 생각이 없다, 그래서 모든 값에 입력 한대로 당신은 명시 적으로 유형을 지정해야합니다 스칼라.

이 코멘트에 다른 문제에 대답하기 위해, reduce 방법은 A 여기 (String, Int)입니다 매개 변수 [A1 >: A]를 입력 있으며, 따라서 컴파일러는 문제가 당신이 원하는 실제의 형태를 추론을 가지고는 하한 reduce의 결과입니다 .

+1

상한 것은 유망한 것처럼 들리지만 ... 그럼 왜'List (1,2,3,4) .reduce (_ + _)'가 작동합니까? – Dima

+0

@Dima 이것은 실제로 Det의 응답에 응답됩니다. '_ + _ '는 부분 함수가 아니라 완전한 "함수"를 형성합니다. 예를 들어, 이것은'List (1,2,3,4) .reduce ({case x : (Int, Int) => x._1 + x._2})'와 같이 컴파일되지 않습니다. – henrik

0

코드 블록 내에 사례을 사용하면 전체 기능이 아닌 부분 기능을 구성하는 것이 문제입니다.

그래서 부분적인 기능을 위해서는 컴파일러가 컨텍스트에서 정확한 유형을 추론하거나 심지어 불가능할 수도 있습니다.

부분 기능에 대한 자세한 설명은 http://blog.bruchez.name/2011/10/scala-partial-functions-without-phd.html?m=1을 참조하십시오.

관련 문제