3

我想要更高阶函数中的隐式参数,例如:

func(arg1) { 隐式 (x, y) => x * y }

但是编译器说:

错误:定义 val a = func("2", "4") { 隐式 (x, y) => ^ 的预期开始

  • java版本“1.7.0_40”
  • Scala 代码运行器版本 2.10.2-RC2 -- 版权所有 2002-2013,LAMP/EPFL

可运行的示例代码:

object Test extends App {
    new Test().run
}

class Test {
    def run = {
        val a = func("2", "4") { (x, y) => // It's OK
            x * y
        }
        println("a: " + a)

        val b = gunc("2", "4") { implicit x => { implicit y => // It's OK
            x * y
        }}
        println("b: " + b)
    }

    def func(x: String, y: String)(f: (Int, Int) => Int) = f(x.toInt, y.toInt)
    def gunc(x: String, y: String)(g: Int => Int => Int) = g(x.toInt)(y.toInt)
    def hunc(x: String, y: String)(h: Tuple2[Int, Int] => Int) = h((x.toInt, y.toInt))
}

[添加评论]

我想知道...

我们可以用一个 arg 声明为“隐式 x => ...”。

似乎没有办法声明两个隐式参数。

4

2 回答 2

1

尝试添加:

val c = hunc("2", "4") { implicit pair => pair._1 * pair._2 }
于 2013-10-22T13:28:04.310 回答
1

当您说implicit y => y * 2您没有声明隐式参数而是将函数标记为隐式时,因此您可以对此进行模拟:

implicit val f1 = (y: Int) => y * 2
def func1(x: String, y: String)(f: Int => Int) = f(1)
func1("", "")(f1)

当您想将具有两个参数的函数标记为隐式时,您可以这样做:

implicit val f2 = (x: Int, y: Int) => y * 2
def func2(x: String, y: String)(f: (Int, Int) => Int) = f(1, 2)
func2("", "")(f2)

但是您不能这样做: func2("", "")(implicit (x, y) => x)在这种特殊情况下,我只是看不到使用隐式的任何含义。

你也可以看到这个问题,也许你会在那里找到一些有用的信息

于 2013-10-22T14:06:08.117 回答