关于scala类型推断的编译错误

我正在做一个简单的练习,要求我使用foldRight在列表上实现独立的“映射”功能。 我提出的解决方案是这样的:

def mapFun[T,U](xs: List[T], f: T => U): List[U] = {
  (xs foldRight List[U]())((x, y) => f(x) :: y)
}

val sl = List(1,2,3)

//now try to square every item
mapFun(sl, x => x * x)  //**missing parameter type**
mapFun(sl, (x:Int) => x * x) //ok, gives List(1,4,9)

如上所述,必须为要编译的代码指定明确的'Int'类型。 然而,在我看来,编译器应该能够推断'x'的类型,因为'sl'是'List [Int]'类型,这意味着T是'Int',然后'x * x'表达式的类型是U也应该是'诠释'。

我想这可能与方差或矛盾类型的东西有关,或者将子打字与泛型打字混合在一起。

我的scala编译器版本是2.11捆绑(动态)。


标准答案的补充:从Scala的函数式编程第3章:

这是Scala编译器的一个不幸的限制; 其他功能语言如Haskell和OCaml提供了完整的推理,这意味着类型注释几乎不需要


Scala的类型推断不会在参数列表中流动,只能在参数列表之间流动。 这将工作:

def mapFun[T,U](xs: List[T])(f: T => U): List[U] = {
  (xs foldRight List[U]())((x, y) => f(x) :: y)
}

val sl = List(1,2,3)
println(mapFun(sl)(x => x * x))
链接地址: http://www.djcxy.com/p/38025.html

上一篇: A compiling error about scala type inference

下一篇: Scala type checker cannot infer types correctly