2013-09-03 28 views
7

Tôi muốn có hàm bậc cao hơn trong tham số một hàm chấp nhận tham số ngầm định cụ thể.Loại hàm có tham số Implicit trong Scala

Để chính xác hơn, tôi đang cố gắng tạo một hàm cần có phương thức tạo Future phụ thuộc vào ngữ cảnh ngầm và trả về một phương thức không phụ thuộc vào ngữ cảnh.

Để cụ thể hơn, chúng ta hãy nói rằng tôi có một cái gì đó như thế này:

def foo(a: Int)(implicit ctx: ExecutionContext): Future[Float] = future { somelongBar... } 

Tôi muốn có một phương pháp như thế này:

def provideCtx[A](func: ExecutionContext => A): A = { 
    val ctx = setupCtx 
    func(ctx) 
} 

nhưng nếu tôi gọi provideCtx(foo), các trình biên dịch phàn nàn về bối cảnh thực thi ngầm thiếu.

Thực tế là tôi đang xử lý với một ExecutionContext không phải là rất quan trọng. Những gì tôi muốn tìm là làm thế nào để viết kiểu tham số để chấp nhận một hàm với một đối số ngầm định của một kiểu cụ thể. Tôi hiểu rằng phần ngầm định là một đối số được nghiền, để thực tế tôi có một chức năng như vậy: ExecutionContext => Int => Future[Float] và tôi khá chắc chắn rằng khi chạy, jvm không biết rằng ExecutionContext là ngầm, nhưng tôi không thể làm cho trình biên dịch hiểu điều đó.

Trả lời

2

Vấn đề là foo là một phương pháp, không phải là một hàm và mở rộng eta (chuyển đổi phương thức thành hàm) không được cố gắng cho đến sau ứng dụng ngầm. Xem phần 6.26.2 của đặc tả ngôn ngữ để biết chi tiết và this issue để thảo luận thêm.

Một workaround sẽ được để viết một cái gì đó như thế này:

provideCtx((ctx: ExecutionContext) => (a: Int) => foo(a)(ctx)) 

Tôi không chắc chắn một giải pháp chung chung hơn là tốt (ít nhất mà không một số loại phản xạ, vv), kể từ khi chúng ta không thể thậm chí là tham khảo foo (ngoại trừ trong một cuộc gọi phương thức, tất nhiên) mà không có một phạm vi tiềm ẩn trong phạm vi.

+0

thực sự, tôi đã kết thúc viết một cái gì đó rất giống nhau ngay bây giờ, nó chỉ là một chút cồng kềnh. – Mortimer

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