2012-06-04 8 views
7

Sau khi phát hiện ra rằng currying multi parameter-groups method is possible, tôi đang cố gắng để có được một hàm được áp dụng một phần đòi hỏi các tham số ngầm định.Scala, Currying trên phương pháp đa tham số nhóm bao gồm các tham số ngầm định?

Đường nối không thể thực hiện được. Nếu không bạn có thể giải thích cho tôi tại sao?

scala> def sum(a: Int)(implicit b: Int): Int = { a+b } 
sum: (a: Int)(implicit b: Int)Int 

scala> sum(3)(4) 
res12: Int = 7 

scala> val partFunc2 = sum _ 
<console>:8: error: could not find implicit value for parameter b: Int 
     val partFunc2 = sum _ 
        ^

Tôi sử dụng một đối tượng đơn lẻ để tạo chức năng được áp dụng một phần này và tôi muốn sử dụng nó trong phạm vi int được xác định.

Trả lời

8

Đó là vì bạn không có phạm vi Int ngầm định. Xem:

scala> def foo(x: Int)(implicit y: Int) = x + y 
foo: (x: Int)(implicit y: Int)Int 

scala> foo _ 
<console>:9: error: could not find implicit value for parameter y: Int 
       foo _ 
      ^

scala> implicit val b = 2 
b: Int = 2 

scala> foo _ 
res1: Int => Int = <function1> 

Hàm ẩn được thay thế bằng giá trị thực của trình biên dịch. Nếu bạn curry phương thức kết quả là một hàm và các hàm không thể có các tham số ngầm, do đó trình biên dịch phải chèn giá trị vào lúc bạn curry phương thức.

chỉnh sửa:

Đối với trường hợp sử dụng của bạn, tại sao bạn không thử một cái gì đó như:

object Foo { 
    def partialSum(implicit x: Int) = sum(3)(x) 
} 
+0

Cảm ơn. Nhưng như tôi đã nói, tôi cần khai báo hàm này trong một đối tượng đơn lẻ khác. Tôi cần phải tuyên bố nó ra khỏi bối cảnh mà tôi sử dụng nó. – iwalktheline

+0

đã chỉnh sửa bài đăng của tôi. Tôi nghĩ rằng không có cách nào khác để làm điều này, vì những lý do tôi đã đề cập. – drexin

+0

Bạn nói đúng. Khi currying cho Function và Function không cho phép các tham số ẩn, tôi cần liệt kê các tham số của một trong hai nhóm. – iwalktheline

0
scala> object MySingleton { 
| def sum(a: Int)(implicit b: Int): Int = { a+b } 
| 
| 
| def caller(a: Int) = { 
|  implicit val b = 3; // This allows you to define the partial below 
|  def pf = sum _  // and call sum()() without repeating the arg list. 
|  pf.apply(a) 
| } 
| } 
defined module MySingleton 


scala> MySingleton.caller(10) 
res10: Int = 13 
+3

Chào mừng bạn đến với SO! Xin vui lòng, xem xét để lại một số lời giải thích trực quan, thay vì chỉ gửi mã. – vefthym