2013-10-22 47 views
3

我想在一个高阶函数IMPLICIT指定参数时,像:如何在高阶函数中声明隐式参数?

FUNC(ARG1){隐式的(X,Y)=> X * Y}

但是,编译器说:

错误:定义 val的预计开始一个= 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声明为“implicit x => ...”。

看来没有办法声明两个隐式参数。

+0

显然,它不会解决问题,但你为什么不更新到** **最终斯卡拉的版本,例如2.10.2或2.10.3? –

+0

没理由=>我更新了2.10.2。 '明显'意味着什么? Scala Prog Lang Spec提到这个问题? –

+0

我说*显然*因为解析器的工作方式(您的问题是语言语法)通常不会在发布候选版和最终版本之间发生变化。所以,升级到稳定版本并不能解决这个问题,而是会带给你整体的稳定性。 –

回答

1

尝试增加:

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

谢谢。有用。但它是'一个arg'的例子而不是'TWO args'。 –

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),在这种特殊情况下,我只是没有看到任何含义使用implicits。

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

+0

谢谢。我编辑了原文。 –