如何在Scala中为未指定数量的参数设置函数?
我想为函数的未指定数量的参数创建一些函数 比如说如何在Scala中为未指定数量的参数设置函数?,scala,Scala,我想为函数的未指定数量的参数创建一些函数 比如说 scala> def test(fx: (String*) => Boolean, arg: String*): Boolean = fx(arg: _*) test: (fx: String* => Boolean, arg: String*)Boolean scala> def AA(arg1: String, arg2: String) :Boolean = { println ("Arg1 : "
scala> def test(fx: (String*) => Boolean, arg: String*): Boolean = fx(arg: _*)
test: (fx: String* => Boolean, arg: String*)Boolean
scala> def AA(arg1: String, arg2: String) :Boolean = {
println ("Arg1 : " + arg1 + " Arg2 : " + arg2)
true}
AA: (arg1: String, arg2: String)Boolean
scala> test(AA,"ASDF","BBBB")
<console>:10: error: type mismatch;
found : (String, String) => Boolean
required: String* => Boolean
test(AA,"ASDF","BBBB")
^
scala>def测试(fx:(String*)=>Boolean,arg:String*):Boolean=fx(arg:*)
测试:(fx:String*=>Boolean,arg:String*)Boolean
scala>def AA(arg1:String,arg2:String):布尔={
println(“Arg1:+Arg1+”Arg2:+Arg2)
真的}
AA:(arg1:String,arg2:String)布尔值
scala>测试(AA,“ASDF”,“BBBB”)
:10:错误:类型不匹配;
找到:(字符串,字符串)=>布尔值
必需:字符串*=>布尔值
测试(AA、“ASDF”、“BBBB”)
^
如何解决此问题???这是因为
AA
不接受可变数量的参数,请将其更改为:
def AA(args: String*) :Boolean
这是因为
AA
不接受可变数量的参数,请将其更改为:
def AA(args: String*) :Boolean
这可以通过使用
ProductArgs
中的shapeless和类似于我的另一个问题的东西来实现
import shapeless.{HList, ProductArgs}
import shapeless.ops.hlist.IsHCons
import shapeless.ops.function.FnToProduct
import shapeless.syntax.std.function._
object test extends ProductArgs {
def applyProduct[L <: HList, NarrowArgs <: HList, Args <: HList, F, R](
l: L
)(implicit
ihc: IsHCons.Aux[L, F, NarrowArgs],
ftp: FnToProduct.Aux[F, Args => R],
ev: NarrowArgs <:< Args
): R = {
val (func, args) = (l.head, l.tail)
func.toProduct(args)
}
}
扩展ProductArgs
转换或test(aa,“foo”)
(实际上是test.apply(aa,“foo”)
)到test.applyProduct((aa::“foo::HNil)
。在applyProduct
中,我们检查HList
是否包含函数和有效参数
我们不应该需要
窄参数这可以通过使用产品参数的shapeless和类似于我的另一个问题来完成
import shapeless.{HList, ProductArgs}
import shapeless.ops.hlist.IsHCons
import shapeless.ops.function.FnToProduct
import shapeless.syntax.std.function._
object test extends ProductArgs {
def applyProduct[L <: HList, NarrowArgs <: HList, Args <: HList, F, R](
l: L
)(implicit
ihc: IsHCons.Aux[L, F, NarrowArgs],
ftp: FnToProduct.Aux[F, Args => R],
ev: NarrowArgs <:< Args
): R = {
val (func, args) = (l.head, l.tail)
func.toProduct(args)
}
}
扩展ProductArgs
转换或test(aa,“foo”)
(实际上是test.apply(aa,“foo”)
)到test.applyProduct((aa::“foo::HNil)
。在applyProduct
中,我们检查HList
是否包含函数和有效参数
我们不需要窄参数,谢谢。但是我想得到所有函数,而不需要参考任何数量的参数。如果我有两个函数,比如defaa(arg:String)=println(arg)
和defbb(arg1:String,arg2:String)=println(arg1+arg2)
,我想把它作为参数传递给测试函数<代码>测试(AA,“你好”)
和测试(BB,“你好”,“世界”)
可能吗?我不确定是否可能。谢谢。但是我想得到所有函数,而不需要参考任何数量的参数。如果我有两个函数,比如defaa(arg:String)=println(arg)
和defbb(arg1:String,arg2:String)=println(arg1+arg2)
,我想把它作为参数传递给测试函数<代码>测试(AA,“HELLO”)
和测试(BB,“HELLO”,“WORLD”)
是否可能?我不确定这是否可能。有一些方法可以解决这个问题,但您确实意识到,这意味着您在运行时传递args
所需的不同数量的值时可能会出现错误?你同意吗?另外,你能更具体地说明你想要达到的目标吗?目前,您的test
方法只不过是调用传递的函数,因此很难猜测您为什么不能直接调用该函数(因此很难提出任何可能更明智的替代方案)有办法解决这个问题,但您确实意识到,这意味着您在运行时传递args
所需的不同数量的值时可能会出现错误?你同意吗?另外,你能更具体地说明你想要达到的目标吗?目前,您的test
方法只不过是调用传递的函数,因此很难猜测为什么您不能直接调用函数(因此很难提出任何可能更合理的替代方案),这很好,但它明确假设函数的arity(事实上,甚至是确切的签名)在调用test
时完全知道(或者——不可否认——我们可以将无形状类型类实例与函数一起传递,以使调用编译)。如果是这样的话,test
除了直接调用所述函数(或者向执行该操作的test
传递thunk)之外,还能给表带来什么呢。我认为如果OP能准确地解释他的用例会更有成效。@RégisJean Gilles你是对的,test
实际上并不是很有用。这很好,但它明确地假设调用test
(或者——诚然——我们可以将不成形类型类实例与函数一起传递,以使调用可编译)。如果是这样,那么除了直接调用所述函数(或者将thunk传递给执行此操作的test
)之外,test
还能给表带来什么.我认为如果OP能准确地解释他的用例会更有成效。@RégisJean Gilles你是对的,test
实际上并没有什么用处。