2013-07-18 12 views
8

Ho le funzioni scala chiamate "run1" e "run2" che accettano 3 parametri. Quando li applico voglio fornire una funzione anonima con parametri impliciti. Non funziona in entrambi i casi nei seguenti codici di esempio. Voglio sapere seCome si crea la funzione scala anonima con più parametri impliciti

  1. E 'anche possibile?
  2. Se è possibile, qual è la sintassi?



     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

possibile duplicato del [letterale funzione con argomenti multipli impliciti] (http://stackoverflow.com/questions/14072061/function-literal-with-multiple-implicit- argomenti) – Noah

+0

Non funziona nel mio caso in "run2", sto usando scala 2.10.0. – Michael

+0

Il tuo tipo non è al curry, lo stai inserendo nella funzione 'run2' stessa. 'fType = Object => String => Long => Object' funzionerebbe. – Noah

risposta

15

Stai accattivarsi la funzione all'interno run2 così run2 ha ancora bisogno di una funzione non curry. Vedere il codice qui sotto per una versione che funziona:

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

Il mio errore. Grazie capito. – Michael

Problemi correlati