我正在做一个简单的练习,要求我使用foldRight在列表上实现一个独立的"map"函数.我想出的解决方案是这样的:
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)
Run Code Online (Sandbox Code Playgroud)
如上所述,必须为要编译的代码指定显式的"Int"类型.然而在我看来,编译器应该能够推断'x'的类型,因为'sl'是'List [Int]'类型,这意味着T是'Int'然后'x*x'表达式的类型U也应该是'Int'.
我想这可能与方差或反方差类型的东西或子类型与泛型类型混合的东西有关.
我的scala编译器版本是2.11 bundle(动态).
标准答案的补充:来自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))
Run Code Online (Sandbox Code Playgroud)