2013-07-18 28 views
8

Tôi có các hàm scala được gọi là "run1" và "run2" chấp nhận 3 tham số. Khi tôi áp dụng chúng tôi muốn cung cấp một hàm ẩn danh với các tham số ngầm định. Nó không hoạt động trong cả hai trường hợp trong các mã ví dụ bên dưới. Tôi muốn biết nếuLàm thế nào để bạn tạo chức năng ẩn danh scala với nhiều tham số ngầm định

  1. Điều đó có thể thực hiện được không?
  2. Nếu có thể, cú pháp là gì?



     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

có thể trùng lặp của [Hàm chữ với nhiều đối số ẩn] (http://stackoverflow.com/questions/14072061/function-literal-with-multiple-implicit- đối số) – Noah

+0

Nó không hoạt động trong trường hợp của tôi tại "run2", tôi đang sử dụng scala 2.10.0. – Michael

+0

Loại của bạn không bị quấy rầy, bạn đang tự xay nó trong chính hàm 'run2'. 'fType = Object => String => Long => Object' sẽ hoạt động. – Noah

Trả lời

15

Bạn đang tách lạng bộ các chức năng bên trong run2 nên run2 vẫn cần một hàm phi cà ri. Xem mã bên dưới để biết phiên bản hoạt động:

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

Sai lầm của tôi. Cảm ơn đã nhận nó. – Michael

Các vấn đề liên quan