将现有函数分配给变量

时间:2017-05-01 08:22:21

标签: scala

我想将现有函数分配给变量。根据{{​​3}}网站,它很简单:

val p = scala.math.pow(_, _)
pow: (Double, Double) => Double = <function2>

但是当我尝试在我的代码中执行相同的操作时,它不起作用。

def main(args: Array[String]) = {
    val p = scala.math.min(_, _)
    val func = if ( args(0).equalsIgnoreCase("min"))  math.min(_,_) else math.max(_,_)
}

我认为这可能是由于在同一行中使用ifelse条件,但在将值赋给变量p时也会出错。

我得到错误:

  

缺少扩展函数的参数类型((x $ 1,x $ 2)=&gt;   scala.math.min(x $ 1,x $ 2))

为什么它对我不起作用,我该如何解决?

2 个答案:

答案 0 :(得分:2)

必须为func

定义类型参数
val func: (Int, Int) => Int = if (args.head.equalsIgnoreCase("min"))  math.min(_,_) else math.max(_,_)

或者如用户dmitry指出的那样,使用单个下划线:

val func = if (args.head.equalsIgnoreCase("min"))  math.min _ else math.max _

然而,看起来你是这门语言的初学者 - 我个人会练习明确地说明第一个例子中的兴趣类型,直到你对事情有更好的处理。

答案 1 :(得分:1)

只有一个scala.math.pow方法,但minmax有多个重载:def min(x: Double, y: Double): Doubledef min(x: Int, y: Int): Int等。没有提供预期的参数类型,Scala不知道你的意思。我会写,例如val p = scala.math.min(_: Int, _: Int)val p = scala.math.min(_: Double, _: Double)(或者您可以直接在Tanjin的答案中指定p的类型)。

val p = min _恰好起作用,因为min(x: Int, y: Int)重载是最具特异性的,但我认为在启动时依赖它是一个坏主意。