2013-10-22 87 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

謝謝。我編輯了原文。 –