2011-06-23 60 views
7

Tôi gặp một vấn đề trong DSL của tôi với các phương pháp chung chung quá tải dẫn đến việc biên dịch muốn tôi để thêm các loại thông số rõ ràng:"Thiếu loại tham số" trong phương pháp chung chung quá tải tham gia một cuộc tranh luận chức năng

def alpha[T](fun: Int => T): String = fun(33).toString 

def beta [T](fun: Int => T): String = fun(66).toString 
def beta [T](thunk: => T): String = thunk.toString 

alpha { _ + 11 }   // ok 
beta { _ + 22 }   // "error: missing parameter type for expanded function" 
beta { _: Int => _ + 22 } // ok... ouch. 

Bất kỳ cơ hội tôi có thể loại bỏ sự lộn xộn trong dòng cuối cùng?

EDIT:

Để chứng minh rằng quá tải không phải là một vấn đề mơ hồ để scalac cho mỗi gia nhập, đây là một phiên bản mà không cần tham số kiểu mà làm việc hoàn toàn tốt đẹp:

def beta(fun: Int => String): String = fun(66).reverse 
def beta(thunk: => String): String = thunk.reverse 

beta(_.toString) // ok 
beta("gaga")  // ok 

Trả lời

4

Vấn đề là Int => T cũng là một loại. Ví dụ, nói rằng bạn được xác định chỉ là thứ hai beta:

def beta[ T ](thunk: => T) : String = thunk.toString 

Và bây giờ bạn vượt qua một chức năng Int => Int với nó:

scala> beta((_: Int) + 1) 
res0: String = <function1> 

Vì vậy, cho rằng một chức năng phù hợp với => T, và rằng bạn cũng có một số Int => T, Scala phải biết bạn muốn cái nào? Nó có thể là một String, ví dụ:

scala> beta((_: String) + 11) 
res1: String = <function1> 

Làm thế nào Scala có thể cho rằng đó là một Int? Các ví dụ bạn đã chứng minh là quá tải không phải là đổ lỗi cho việc không chứng minh bất kỳ thứ gì như vậy, bởi vì bạn đã loại bỏ các tham số kiểu trong chúng.

1

Như bạn có thể có đã xảy ra, sự cố xảy ra vì bạn có chức năng beta bị quá tải. Khi bạn xác định:

beta { _ + 22 } 

bạn mong đợi phiên bản beta nào? Scala không thể biết rằng _ là một Int chỉ vì bạn đang cộng nó với 22. Vì vậy, ví dụ cụ thể này, bạn phải xác định những gì _ là.

+0

Có thể, bởi vì đối số là Int => T. Scalac biết rằng trong trường hợp 'alpha', tại sao nó không biết nó trong trường hợp' beta'? –

+0

Vì 'beta' bị quá tải, và có hai lựa chọn, một trong số đó lấy' Int => T' và một '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''. Đó là lý do tại sao không thể nói bạn đang nói đến cái nào mà không nói rõ ràng. Alpha hoạt động chính xác vì chỉ có một sự lựa chọn. – rafalotufo

+4

Điều đó không đúng. Đó là lỗi do kết quả có tham số kiểu. Không có sự mơ hồ cho dù tôi gọi là thunk hoặc phiên bản chức năng nếu phương pháp không phải là chung chung. Tôi đã chỉnh sửa câu hỏi để hiển thị điều này. –

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