Scala中不使用柯里化实现带可变参数的偏应用函数
Scala偏应用函数结合可变参数(非柯里化实现)
你遇到的问题核心是:Scala对可变参数Int*的偏应用推断逻辑和普通参数不同,直接用_会导致类型不匹配。下面给你两种非柯里化的解决方式:
方式一:显式适配可变参数的偏应用类型
通过_*明确告知Scala将占位符对应到可变参数序列,同时指定函数类型:
def func1(a: Int, b: Int*): Unit = { println(a) println(s"可变参数内容:${b.mkString(",")}") } // 偏应用第一个参数,将第二个可变参数部分指定为Seq[Int]类型 val func2: Seq[Int] => Unit = func1(2, _*) // 调用时直接传入多个整数,Scala会自动打包为Seq func2(2, 3, 4)
方式二:用包装函数保留可变参数调用语法
如果希望func2直接支持func2(2,3,4)这种原生可变参数调用方式,可以写一个简单的包装方法:
def func1(a: Int, b: Int*): Unit = { println(a) println(s"可变参数内容:${b.mkString(",")}") } // 定义包装方法,内部转发参数给原方法 def func2(b: Int*): Unit = func1(2, b: _*) // 直接以可变参数方式调用 func2(2,3,4)
错误原因说明
原代码中func1(2,_)的占位符_会被Scala默认推断为需要单个Int参数,但func1的第二个参数是Int*(本质是Seq[Int]),因此出现「找到Seq[Int],需要Int」的类型不匹配错误。_*是Scala中用于将序列展开为可变参数的语法,或者用包装函数的方式可以更直观地保留可变参数的调用体验。
内容的提问来源于stack exchange,提问作者Dhruv
相关产品推荐
相关产品推荐

