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
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'? –
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
Đ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. –