Hàm Currying
Trong khoa học máy tính, Currying, còn được gọi là phần tử hóa, là một kỹ thuật chuyển đổi một hàm sử dụng nhiều tham số thành một chuỗi các hàm sử dụng một tham số duy nhất và trả về một hàm mới nhận các tham số còn lại và trả về kết quả.
Currying là việc chuyển đổi một hàm có nhiều tham số thành một chuỗi các hàm chỉ nhận một tham số (tham số đầu tiên của hàm ban đầu) và trả về một hàm mới nhận các tham số còn lại và trả về kết quả. Ý tưởng cốt lõi là chia nhỏ hàm có nhiều tham số thành các hàm chỉ nhận một tham số (hoặc một phần) và sau đó trả về việc gọi hàm chỉ nhận một tham số (hoặc một phần) tiếp theo, tiếp tục xử lý các tham số còn lại.
Giả sử hàm này được sử dụng để tính tổng, thì Currying sẽ chuyển đổi hàm ban đầu nhận nhiều tham số để tính tổng thành một chuỗi các hàm chỉ nhận một tham số và tính tổng từng tham số một. Điều này làm cho việc hiểu rõ hơn.
Cài đặt
Triển khai từng bước một hàm Currying.
Thêm nhiều tham số:
Sử dụng đệ quy để đơn giản hóa cách viết này:
Ở đây thiếu một điều kiện dừng vòng lặp, vì vậy hàm nest
trước tiên sẽ thêm một tham số mới là i
, khi i === N
thì đệ quy dừng lại.
Tiếp theo, cần một mảng để lưu trữ các tham số tùy ý, gọi mảng này là args
, sau đó truyền vào hàm nest
.
Cuối cùng, thêm xử lý cho trường hợp không có tham số, chúng ta đã hoàn thành phiên bản cuối cùng của hàm Currying.
Ví dụ
Ví dụ 1: Triển khai một hàm Currying tính tổng
Dường như khá tinh vi, nhưng loại bài toán này rõ ràng không phải là một câu hỏi phỏng vấn dựa trên thực tế.
Ví dụ 2: Tìm kiếm một giá trị trong một mảng
Một hàm đơn giản để tìm kiếm một giá trị trong một mảng, mỗi lần sử dụng đều cần gọi như vậy.
Vì arr
là một tham số cố định, chúng ta có thể lưu trữ một hàm đã nhận arr
, sau đó sử dụng hàm này để xử lý các tham số thay đổi.
Mục đích của việc sử dụng hàm Currying có thể hiểu là: tái sử dụng tham số. Bản chất là giảm tính chung chung và tăng tính ứng dụng.
Triển khai Currying đơn giản
Hàm Uncurrying
Ngược lại với Currying.
- Currying được sử dụng để giới hạn phạm vi áp dụng, tạo ra một hàm có tính chất đặc thù hơn;
- “Không Currying” được sử dụng để mở rộng phạm vi áp dụng, tạo ra một hàm có tính chất áp dụng rộng hơn.
Chuyển đổi mã tương ứng như sau.
Ví dụ
Việc sử dụng hàm gốc của mảng thông qua hàm call
là một ứng dụng phổ biến. Trong ví dụ này, chúng ta sử dụng call
để trích xuất một hàm mới, có thể nhận nhiều tham số và loại dữ liệu khác nhau, có tính ứng dụng rộng hơn.