Trong Scala, tại sao một hàm curried có thể dễ dàng được truyền trực tiếp đến các hàm khác, nhưng khi gán nó vào một số val
thì cũng cần áp dụng một phần nó với _
? Ví dụ, với hai chức năng:Tại sao Scala yêu cầu áp dụng một phần các chức năng được kết hợp khi gán cho một val?
def curried(a: Int)(b: Int) = a + b
def test(a: Int, f: Int => Int) = f(a)
tôi có thể dễ dàng vượt qua curried
-test
với:
test(5, curried(5))
và mọi thứ đều hạnh phúc. Tuy nhiên, nếu tôi chỉ đơn giản gọi curried(5)
tôi nhận được một lỗi:
scala> curried(5)
<console>:9: error: missing arguments for method curried;
follow this method with `_' if you want to treat it as a partially applied function
curried(5)
Nếu tôi thay đổi cuộc gọi bao gồm thông tin loại tuy nhiên, nó hoạt động:
val 'curried: Int => Int = curried(5)
bất cứ ai có thể giải thích hợp lý đằng sau những mâu thuẫn, chắc chắn là Trình biên dịch Scala có thể suy ra rằng hàm này là Int => Int
cho định nghĩa kiểu trên phương thức gốc?
Trong trường hợp 'val' nếu bạn đưa ra một chú thích kiểu, bạn sẽ không cần ứng dụng một phần quá mức' _'. –