在Scala中使用参数调用函数

在Scala中使用参数调用函数,scala,Scala,考虑以下代码: object HelloIntelliScala { def main(args : Array[String]) = { println(callAnyFunc(funcWithNoArgs)) val l = callAnyFuncWithArgs("bingo") (funcWithArgs) println(l) val l2 = callAnyFuncWithArgs(21) (funcWithArgs2) println

考虑以下代码:

object HelloIntelliScala {
  def main(args : Array[String]) = {
    println(callAnyFunc(funcWithNoArgs))

    val l = callAnyFuncWithArgs("bingo") (funcWithArgs)
    println(l)

    val l2 = callAnyFuncWithArgs(21) (funcWithArgs2)
    println(l2)

  }

  type noArgCallBack = () => Any

  def funcWithArgs(inp : String) : Any = {
    println("Func with arg called, arg value is: " + inp)
    "Hello " + inp + "!"
  }

  def funcWithArgs2(inp : Int) : Any = {
    println("Func with arg called, arg value is: " + inp)
    "Hello, integer " + inp + "!"
  }

  //how do i call this function?
  def funcWithArgs3(inp : Int, name : String) : Any = {
    println("Func with 2 args called, arg values are: " + (inp, name))
    "Hello, multiple args " + (inp, name) + "!"
  }

  def funcWithNoArgs() : Any = {
    println("Function with no args was called!")
    "Hello NO_ARGS"
  }

  def callAnyFunc(callback : noArgCallBack) : Any = {
    callback();
  }

  def callAnyFuncWithArgs[A, B](arg : A)(f : A => B) : Any = {
    f(arg);  //how do I pass variable args here
  }
}

我需要一种通用的方法来调用任何带有参数的函数,就像没有参数的函数一样。请注意,要传入的参数列表可以是可变的,我们在编译时不知道参数类型。此外,我确实需要Any返回类型,因为我需要将此值用于后期处理。有办法做到这一点吗?

这可能适用于函数currying。。。 请看这里:
然后你可以把函数包装起来,调用一个curried函数(function.curried),然后在某个时候简单地填充参数,然后调用它,这可能与函数curried一起工作。。。 请看这里:
然后,您可以将该函数包装为在curried函数(function.curried)中调用,只需在某个点填充参数,然后调用它,我想您需要类似以下内容:

def funcWithArgs(args: String*) = args foreach println
def callAnyFuncWithArgs[A, B]
  (args: A*)(f: (A*) => B) = f(args: _*)
然后将funcWithArgs作为部分应用的函数调用:

callAnyFuncWithArgs("bingo")(funcWithArgs _)

我想你想要的是:

def funcWithArgs(args: String*) = args foreach println
def callAnyFuncWithArgs[A, B]
  (args: A*)(f: (A*) => B) = f(args: _*)
然后将funcWithArgs作为部分应用的函数调用:

callAnyFuncWithArgs("bingo")(funcWithArgs _)

Scala不会抽象方法的算术性。或者,换句话说,如果不为每种算术编写样板文件,就无法做到这一点


幸运的是,迈尔斯·萨宾(Miles Sabin)编写了所有的样板文件。

Scala并没有抽象出方法的算术性。或者,换句话说,如果不为每种算术编写样板文件,就无法做到这一点



幸运的是,迈尔斯·萨宾(Miles Sabin)编写了所有的样板文件。

只是为了澄清,我需要使用通用调用机制调用不止一个这样的函数。这些函数,但是我仍然不知道如何使其适用于变量arg list。我已经更新了代码,使其包含loan模式,允许我调用只接受一个参数的函数,如何为变量arg list扩展它?只是为了澄清,我需要使用泛型调用机制调用多个这样的函数。虽然有帮助,但我仍然无法确定如何使其适用于变量arg列表。我已更新代码,以包括loan模式,允许我调用只接受一个参数的函数,如何为变量arg list扩展它?这很有趣,但它限制了我在编译时指定arg类型。还有,我如何使用它来调用多个这样的函数呢?这很有趣,但它限制了我在编译时指定arg类型。还有,我如何使用它来调用多个这样的函数呢?您可以将返回类型设置为
B
+1,这很好,但实际上,我们可以删除返回类型,因为编译器将推断出B返回类型(我们调用的是一个本身返回B的函数);当然,这只适用于调用f()是要执行的唯一操作的情况;否则,那么是的,OP应该强制执行B返回类型显式Lanks virtualeyes,我已经将代码更改为上面的代码,但是正如Daneiel指出的,我仍然需要编写一堆样板代码。关于返回类型的观点很好@破解所有我已经更新了答案,以显示基于varargs的可能用例;如果您需要混合类型的特定算术,可能需要不成形或某种形式的范畴理论,因为它是疯狂的;-)您可以将返回类型设置为
B
+1,这一点很好,但实际上,我们可以删除返回类型,因为编译器将推断B返回类型(我们调用的函数本身返回B);当然,这只适用于调用f()是要执行的唯一操作的情况;否则,那么是的,OP应该强制执行B返回类型显式Lanks virtualeyes,我已经将代码更改为上面的代码,但是正如Daneiel指出的,我仍然需要编写一堆样板代码。关于返回类型的观点很好@破解所有我已经更新了答案,以显示基于varargs的可能用例;如果您需要混合类型的特定算术,可能需要不成形或某种形式的范畴理论,因为它是疯狂的;-)谢谢,我想这可能正好合适;让我运行一些测试用例,我会回来的。我暂时接受你的答案,虽然我还不能深入探讨“变形”,但它似乎可以满足我的需要。谢谢你的帮助。谢谢,我想这可能正好合适;让我运行一些测试用例,我会回来的。我暂时接受你的答案,虽然我还不能深入探讨“变形”,但它似乎可以满足我的需要。谢谢你的帮助。