2015-09-22 20 views
8

Trong Scala bạn có thể làm những việc như:Chức năng các thông số ngầm không dùng nữa nên sau khi đi qua nó để một hàm bậc cao

def foo(implicit v: Int) = println(v); 
def h(x: Int) = { implicit val i: Int = x; foo } 

h(42) 
> 42 

h gọi được foo tham chiếu như một đóng cửa.

Sẽ không lạ để thử qua foo-h như một tham số:

def g(x: Int)(f: Int => Unit) = { implicit val i: Int = x; f } 

Nhưng nó sẽ không hoạt động:

g(1)(foo) 
> error: could not find implicit value for parameter v: Int 

Những gì tôi nghĩ rằng nó xảy ra là foo được được gọi là đánh giá tham số thực tế. Đúng không?

Khi đã thông qua một chức năng với một danh sách tham số bình thường (không ẩn), chức năng không được đánh giá:

def foo2(v: Int) = println("Foo2") 
g(1)(foo2) 
> Int => Unit = <function1> 

Đây là một kết quả mong đợi và foo2 đánh giá không được xét xử như một đánh giá của một thực tế tham số.

Tại sao foo được đánh giá là thông số thực tế khi không có giá trị ngầm để làm như vậy?

tương tự xảy ra với lệnh gán:

val fooref: Int => Unit = foo 
> error: could not find implicit value for parameter v: Int 

Nó giống như từ Int => Unit không phù hợp với một chức năng mà các tham số Int được đánh dấu là tiềm ẩn, trình biên dịch loại bỏ nó như một tham số thực tế có giá trị và do đó cố gắng để đánh giá nó. Không tìm thấy giá trị ngầm được khai báo để thực hiện cuộc gọi.

Nếu trường hợp đó xảy ra, điều gì sẽ là cách thể hiện loại hàm với thông số ngầm?

Trả lời

11

Thật không may, các hàm không thể có tham số ngầm - chỉ các phương thức có thể.

Trong biểu g(1)(foo), foo được chuyển đổi từ một phương pháp đến một chức năng (còn gọi là eta-mở rộng). Và section 6.26.2 của Đặc điểm kỹ thuật Scala nêu rõ rằng đối số ngầm định được áp dụng trước khi mở rộng eta.

Xem vé này: implicit methods behave suboptimally when used non-implicitly

1

Các loại tham số f hoạt gFunction1[Int, Unit]. Function1[A, B] là một đặc điểm với phương pháp đơn apply(a: A): B, trong đó a không ẩn. Do đó, bạn không thể tạo một thể hiện của Function1[Int, Unit] từ foo - nó sẽ không có chữ ký phù hợp.

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