Tôi muốn chuyển đổi hoàn toàn các chức năng từ A => B
sang List[A] => List[B]
.Ngắt nâng trong scala
tôi đã viết định nghĩa ngầm sau:
implicit def lift[A, B](f: A => B): List[A] => List[B] = ...
Thật không may, khi tôi viết đoạn code sau, tiềm ẩn không được áp dụng:
val plusOne: (List[Int]) => List[Int] = (x: Int) => (x + 1)
Nếu tôi chú thích các chức năng theo thời gian rõ ràng, nó hoạt động tốt.
Tại sao? Làm thế nào tôi có thể sửa chữa nó?
CẬP NHẬT. Dường như vấn đề là cụ thể đối với các hàm ẩn danh. So sánh:
@Test
def localLiftingGenerics {
implicit def anyPairToList[X, Y](x: (X, Y)): List[X] => List[Y] = throw new UnsupportedOperationException
val v: List[String] => List[Int] = ("abc", 239)
}
@Test
def localLiftingFuns {
implicit def fun2ListFun[X, Y](f: X => Y): List[X] => List[Y] = throw new UnsupportedOperationException
val v: List[String] => List[Int] = ((x: String) => x.length)
}
Phương án đầu tiên được biên dịch tốt. Điều thứ hai được đánh dấu là lỗi
Bạn có thể cung cấp mã bạn sử dụng để triển khai 'deficit def' không? –
@ChrisJamesC Được cập nhật với một trường hợp kiểm tra –
Bạn có chắc chắn bạn cần/muốn thực hiện việc này không? 'map' mua rất rõ ràng cho một vài ký tự và ví dụ: 'val plusOne: (List [Int]) => List [Int] = _ map (_ + 1)' thực sự ngắn hơn phiên bản của bạn. –