我想知道为什么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类型?
答案 0 :(得分:0)
解释程序不知道combiner
应该期望和返回的类型a
,b
,c
和d
可以是所有类型的任何内容知道),所以你需要明确指定类型,因为所有值都在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。