Scala高阶函数报错求助:map2函数调用语法错误排查
解决Scala柯里化高阶函数递归调用的语法错误
这个问题出在你对柯里化函数的调用语法细节上。你的map2是分成两个参数列表的柯里化函数,但递归调用时写的map2 fun(a_list.tail)不符合Scala的语法规则——编译器没法自动推断你要把fun传给第一个参数列表、a_list.tail传给第二个,所以才会提示你用map2 _或者map2(_)(_)来明确转换逻辑。
修正方案一:明确传递两个参数列表
这是最直观也最推荐的写法,直接按照柯里化函数的定义,分两次传递参数:
def map2(fun: Int=>Int)(a_list: List[Int]): List[Int] = { if (a_list.isEmpty) { List() } else { fun(a_list.head) :: map2(fun)(a_list.tail) } }
这里把递归调用改成map2(fun)(a_list.tail),明确将fun传入第一个参数列表,a_list.tail传入第二个,编译器就能正确识别你的调用意图了。
修正方案二:用下划线显式转换函数形式
如果你想保留类似原写法的结构,可以用map2 _把柯里化函数转换成普通的二元函数(类型为(Int=>Int, List[Int]) => List[Int]),再传递参数:
def map2(fun: Int=>Int)(a_list: List[Int]): List[Int] = { if (a_list.isEmpty) { List() } else { fun(a_list.head) :: (map2 _)(fun)(a_list.tail) } }
不过这种写法可读性不如第一种,一般不推荐在递归场景中使用。
额外优化:让代码更符合Scala风格
Scala里不需要显式写return,函数默认会返回最后一行表达式的结果,你可以简化代码:
def map2(fun: Int=>Int)(a_list: List[Int]): List[Int] = { if (a_list.isEmpty) List() else fun(a_list.head) :: map2(fun)(a_list.tail) }
甚至用模式匹配让逻辑更清晰:
def map2(fun: Int=>Int)(a_list: List[Int]): List[Int] = a_list match { case Nil => Nil case head :: tail => fun(head) :: map2(fun)(tail) }
内容的提问来源于stack exchange,提问作者Khaleefa
相关产品推荐
相关产品推荐

