2013-07-18 24 views
8

3 parametreyi kabul eden "run1" ve "run2" adında ölçekleme işlevlerine sahibim. Onları uygularken örtük parametrelerle anonim bir işlev sağlamak istiyorum. Her iki durumda da aşağıdaki örnek kodlarda çalışmaz.Birden çok örtük parametresi olan scala anonim işlevini nasıl oluşturursunuz?

  1. Bu mümkün mü?
  2. Mümkünse sözdizimi nedir?



     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

([Birden örtük argümanlarla literal Fonksiyon] olası yinelenen http://stackoverflow.com/questions/14072061/function-literal-with-multiple-implicit-: Çalışan bir sürüm için aşağıdaki kodu bakın argümanlar) – Noah

+0

Benim durumumda "run2" de çalışmıyor, scala 2.10.0 kullanıyorum. – Michael

+0

Sizin türünüz küfürlü değil, 'run2' işlevinin kendisinde onu karıştırıyorsunuz. 'fType = Object => String => Long => Object' işe yarayacaktı. – Noah

cevap

15

Sen run2 içindeki fonksiyonunu currying ediyoruz böylece run2 hala olmayan bir Körili işlevini ihtiyacı var.

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

Benim hatam. Teşekkürler aldım. – Michael

İlgili konular