加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:06:35 所属栏目:安全 来源:网络整理
导读:我正在做一个简单的练习,要求我使用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 e
我正在做一个简单的练习,要求我使用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 bundle(动态).

标准答案的补充:从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,3)
println(mapFun(sl)(x => x * x))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读