2013-07-18 78 views
8

我有稱爲「run1」和「run2」的scala函數,它接受3個參數。當我應用它們時,我想提供一個帶有隱式參數的匿名函數。 下面的示例代碼在兩種情況下都不起作用。我想知道如果如何創建具有多個隱式參數的scala匿名函數

  1. 這是甚至可能嗎?
  2. 如果可能,語法是什麼?



     object Main extends App { 
      type fType = (Object, String, Long) => Object 

      def run1(f: fType) { 
      f(new Object, "Second Param", 3) 
      } 

      run1 { implicit (p1, p2, p3) => // fails 
      println(p1) 
      println(p2) 
      println(p3) 
      new Object() 
      } 

      def run2(f: fType) { 
      val fC = f.curried 
      fC(new Object)("Second Param")(3) 
      } 

      run2 { implicit p1 => implicit p2 => implicit p3 => // fails 
      println(p1) 
      println(p2) 
      println(p3) 
      new Object() 
      } 
     } 

+1

的[功能與多個隱參數文字(可能重複http://stackoverflow.com/questions/14072061/function-literal-with-multiple-implicit-參數) – Noah

+0

它不工作在我的情況在「run2」,我使用scala 2.10.0。 – Michael

+0

你的類型沒有咖喱,你在'run2'函數本身中進行曲調。 'fType = Object => String => Long => Object'會起作用。 – Noah

回答

15

你討好裏面run2的功能,所以run2仍然需要一個非咖喱功能。請參閱下面的代碼可用的版本:

object Main extends App { 
    type fType = (Object, String, Long) => Object 
    type fType2 = Object => String => Long => Object //curried 

    def run1(f: fType) { 
    f(new Object, "Second Param", 3) 
    } 

    // Won't work, language spec doesn't allow it 
    run1 { implicit (p1, p2, p3) => 
    println(p1) 
    println(p2) 
    println(p3) 
    new Object() 
    } 

    def run2(f: fType2) { 
    f(new Object)("Second Param")(3) 
    } 

    run2 { implicit p1 => implicit p2 => implicit p3 => 
    println(p1) 
    println(p2) 
    println(p3) 
    new Object() 
    } 
} 
+0

我的錯誤。感謝了。 – Michael

相關問題