Scala自定义MyList的zipWith函数类型推断报错问题
问题分析与解决
你遇到的问题是Scala函数字面量的语法使用错误,下面详细解释原因和正确用法:
错误原因
你写的(Int,String)=>_+"-"+_是错误的语法。在Scala中,函数参数的类型标注必须放在参数名称后面(比如(a: Int, b: String)),而不是直接将类型作为参数名使用。
你的写法相当于把参数命名为Int和String,然后用下划线_来引用这些参数,但Scala的占位符语法_无法和这种命名方式匹配——编译器无法推断_对应的是哪个参数,因此抛出类型推断失败的错误。
为什么_+"-"+_能正常工作
这是Scala的占位符函数语法,规则是:
- 每个
_对应函数的一个参数,按顺序匹配函数签名的参数位置 - 编译器会根据上下文自动推断参数类型:
- 你的
list是MyList[Int],所以zipWith的第一个参数类型A是Int - 你指定了
zipWith[String, String],所以第二个参数类型B是String - 因此编译器能推断出第一个
_对应Int类型参数,第二个_对应String类型参数,最终生成符合(Int, String) => String的函数。
- 你的
正确的写法示例
除了占位符语法,你还可以用以下两种显式写法:
- 显式指定参数类型:
println(list.zipWith[String, String](listOfStrings, (a: Int, b: String) => a + "-" + b))
- 省略参数类型(编译器可通过上下文推断):
println(list.zipWith[String, String](listOfStrings, (a, b) => a + "-" + b))
这两种写法都能正常工作,和占位符语法的效果一致。
内容的提问来源于stack exchange,提问作者Nikhil Padole
相关产品推荐
相关产品推荐

