Tôi đã có câu hỏi này rất nhiều trong khi học và đã được hỏi nó nhiều lần. Cách đơn giản nhất tôi có thể mô tả sự khác biệt là cả hai đều giống nhau :) Hãy để tôi giải thích ... rõ ràng có sự khác biệt.
Cả ứng dụng một phần và currying đều liên quan đến việc cung cấp các đối số cho một hàm, có lẽ không phải tất cả cùng một lúc. Một ví dụ khá kinh điển là thêm hai số. Trong mã giả (thực ra là JS không có từ khóa), hàm cơ sở có thể là như sau:
add = (x, y) => x + y
Nếu tôi muốn một chức năng "addOne", tôi có thể áp dụng một phần hoặc sử dụng nó:
addOneC = curry(add, 1)
addOneP = partial(add, 1)
Bây giờ sử dụng chúng là rõ ràng:
addOneC(2) #=> 3
addOneP(2) #=> 3
Vậy sự khác biệt là gì? Chà, nó tinh tế, nhưng ứng dụng một phần liên quan đến việc cung cấp một số đối số và hàm được trả về sau đó sẽ thực thi chức năng chính theo lệnh gọi tiếp theo trong khi curry sẽ tiếp tục chờ cho đến khi nó có tất cả các đối số cần thiết:
curriedAdd = curry(add) # notice, no args are provided
addOne = curriedAdd(1) # returns a function that can be used to provide the last argument
addOne(2) #=> returns 3, as we want
partialAdd = partial(add) # no args provided, but this still returns a function
addOne = partialAdd(1) # oops! can only use a partially applied function once, so now we're trying to add one to an undefined value (no second argument), and we get an error
Nói tóm lại, sử dụng ứng dụng một phần để điền trước một số giá trị, biết rằng lần sau khi bạn gọi phương thức, nó sẽ thực thi, để lại tất cả các đối số không được xác định; sử dụng currying khi bạn muốn liên tục trả về một hàm được áp dụng một phần nhiều lần nếu cần để hoàn thành chữ ký hàm. Một ví dụ cuối cùng:
curriedAdd = curry(add)
curriedAdd()()()()()(1)(2) # ugly and dumb, but it works
partialAdd = partial(add)
partialAdd()()()()()(1)(2) # second invocation of those 7 calls fires it off with undefined parameters
Hi vọng điêu nay co ich!
CẬP NHẬT: Một số ngôn ngữ hoặc triển khai lib sẽ cho phép bạn chuyển một arity (tổng số đối số trong đánh giá cuối cùng) sang triển khai ứng dụng một phần có thể kết hợp hai mô tả của tôi thành một mớ hỗn độn ... nhưng tại thời điểm đó, hai kỹ thuật là phần lớn có thể hoán đổi cho nhau.