gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:39:44 27 4
gpt4 key购买 nike

我正在做一个简单的练习,要求我使用 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)

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

我想这可能与方差或逆方差之类的东西或子类型与泛型类型混合的东西有关。

我的 Scala 编译器版本是 2.11 包(动态)。

标准答案的补充:来自 Functional Programming in 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))

关于scala - 关于 scala 类型推断的编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41446998/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com