为什么Scala编译器无法从上下文推断出一种函数?

时间:2016-07-13 21:45:26

标签: scala

我想知道为什么Scala编译器无法推断出我的组合器函数的类型。这是代码

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类型?

2 个答案:

答案 0 :(得分:0)

解释程序不知道combiner应该期望和返回的类型abcd可以是所有类型的任何内容知道),所以你需要明确指定类型,因为所有值都在scala中输入。

要在评论中回答您的其他问题,reduce方法的类型参数为[A1 >: A],其中A此处为(String, Int),并且是reduce的下限{1}}的结果,因此编译器无法推断出你想要的实际类型。

答案 1 :(得分:0)

问题是在代码块中使用 case ,你正在形成一个部分功能,而不是一个部分功能。

因此,对于部分函数,​​编译器从上下文中推断出它的正确类型要困难得多,甚至不可能。

有关部分功能的详细解释,请参阅http://blog.bruchez.name/2011/10/scala-partial-functions-without-phd.html?m=1