Scala中递归匿名函数报错:如何声明返回类型?
解决Scala递归匿名函数的类型报错问题
嘿,这个坑我踩过!你遇到的报错是因为匿名递归函数没办法让Scala编译器自动推断返回类型——当你用val定义箭头函数并在内部递归调用它时,编译器还没完全确定这个函数的类型,就碰到了递归调用,所以会提示你需要显式声明类型。
两种可行的解决方法:
1. 显式指定匿名函数的类型签名
直接在val后面加上函数的完整类型,告诉编译器这个函数是接收List[Int]返回Int的:
val sumRecursive: List[Int] => Int = (list: List[Int]) => list match { case Nil => 0 case x::xs => x + sumRecursive(xs) }
这样编译器就知道递归调用的sumRecursive是什么类型,不会再报错了。
2. 改用def定义递归函数
相比val定义的匿名函数,def定义的方法更适合递归场景,编译器能更好地处理类型推断(当然显式声明返回类型也是个好习惯):
def sumRecursive(list: List[Int]): Int = list match { case Nil => 0 case x::xs => x + sumRecursive(xs) }
这种写法更符合Scala中递归函数的常规定义方式,代码也更简洁易读。
为什么会出现这个报错?
简单来说,val是先初始化再使用的,而你在匿名函数内部递归调用sumRecursive时,这个val还没完成初始化,编译器没办法从递归调用里反向推断它的类型,所以必须提前给它指定明确的类型签名。
内容的提问来源于stack exchange,提问作者Mandroid
相关产品推荐
相关产品推荐

