如何在高阶函数中声明隐式参数?

时间:2013-10-22 13:18:53

标签: scala

我希望IMPLICIT args处于更高阶的函数,例如:

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

但是编译器说:

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

  • java版“1.7.0_40”
  • Scala code runner版本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))
}

[ADD COMMENT]

我想知道......

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

似乎没有办法声明两个隐含的args。

2 个答案:

答案 0 :(得分:1)

尝试添加:

val c = hunc("2", "4") { implicit pair => pair._1 * pair._2 }

答案 1 :(得分: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),在这种特殊情况下,我认为没有任何意义可以使用含义。

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

相关问题