Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Scala中为未指定数量的参数设置函数?_Scala - Fatal编程技术网

如何在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
实际上并没有什么用处。