Hiểu biết hạn chế của tôi là như vậy:
1) Ứng dụng một phần chức năng
Ứng dụng chức năng một phần là quá trình trả về một hàm có số lượng đối số ít hơn. Nếu bạn cung cấp 2 trong số 3 đối số, nó sẽ trả về một hàm có 3-2 = 1 đối số. Nếu bạn cung cấp 1 trong 3 đối số, nó sẽ trả về một hàm có 3-1 = 2 đối số. Nếu bạn muốn, bạn thậm chí có thể áp dụng một phần 3 trong số 3 đối số và nó sẽ trả về một hàm không có đối số.
Vì vậy, đưa ra các chức năng sau:
f(x,y,z) = x + y + z;
Khi liên kết 1 đến x và áp dụng một phần cho chức năng trên, f(x,y,z)
bạn sẽ nhận được:
f(1,y,z) = f'(y,z);
Ở đâu: f'(y,z) = 1 + y + z;
Bây giờ nếu bạn đã liên kết y với 2 và z thành 3, và áp dụng một phần f'(y,z)
bạn sẽ nhận được:
f'(2,3) = f''();
Trong đó : f''() = 1 + 2 + 3
;
Bây giờ tại bất kỳ thời điểm nào, bạn có thể chọn để đánh giá f
, f'
hoặc f''
. Vì vậy, tôi có thể làm:
print(f''()) // and it would return 6;
hoặc là
print(f'(1,1)) // and it would return 3;
2) Cà ri
Mặt khác, Curry là quá trình phân tách một hàm thành một chuỗi lồng nhau của một hàm đối số. Bạn không bao giờ có thể cung cấp nhiều hơn 1 đối số, đó là một hoặc không.
Vì vậy, đưa ra chức năng tương tự:
f(x,y,z) = x + y + z;
Nếu bạn chế biến nó, bạn sẽ nhận được một chuỗi gồm 3 chức năng:
f'(x) -> f''(y) -> f'''(z)
Ở đâu:
f'(x) = x + f''(y);
f''(y) = y + f'''(z);
f'''(z) = z;
Bây giờ nếu bạn gọi f'(x)
với x = 1
:
f'(1) = 1 + f''(y);
Bạn được trả về một chức năng mới:
g(y) = 1 + f''(y);
Nếu bạn gọi g(y)
với y = 2
:
g(2) = 1 + 2 + f'''(z);
Bạn được trả về một chức năng mới:
h(z) = 1 + 2 + f'''(z);
Cuối cùng nếu bạn gọi h(z)
với z = 3
:
h(3) = 1 + 2 + 3;
Bạn được trả lại 6
.
3) Đóng cửa
Cuối cùng, Đóng cửa là quá trình thu thập một chức năng và dữ liệu với nhau dưới dạng một đơn vị. Việc đóng hàm có thể mất 0 đến vô số đối số, nhưng cũng nhận thức được dữ liệu không được truyền cho nó.
Một lần nữa, đưa ra chức năng tương tự:
f(x,y,z) = x + y + z;
Thay vào đó, bạn có thể viết một bao đóng:
f(x) = x + f'(y, z);
Ở đâu:
f'(y,z) = x + y + z;
f'
đóng cửa vào x
. Có nghĩa là f'
có thể đọc giá trị của x đó bên trong f
.
Vì vậy, nếu bạn đã gọi f
với x = 1
:
f(1) = 1 + f'(y, z);
Bạn sẽ nhận được một đóng cửa:
closureOfF(y, z) =
var x = 1;
f'(y, z);
Bây giờ nếu bạn gọi closureOfF
với y = 2
và z = 3
:
closureOfF(2, 3) =
var x = 1;
x + 2 + 3;
Mà sẽ trở lại 6
Phần kết luận
Curry, ứng dụng một phần và đóng cửa đều hơi giống nhau ở chỗ chúng phân tách một chức năng thành nhiều phần hơn.
Currying phân tách một hàm của nhiều đối số thành các hàm lồng nhau của các đối số đơn trả về các hàm của các đối số đơn. Không có điểm nào trong việc giới thiệu chức năng của một hoặc ít đối số, vì nó không có ý nghĩa.
Ứng dụng một phần phân rã một hàm của nhiều đối số thành một hàm của các đối số nhỏ hơn mà hiện tại các đối số bị thiếu đã được thay thế cho giá trị được cung cấp.
Việc đóng cửa phân tách một hàm thành một hàm và một tập dữ liệu trong đó các biến bên trong hàm không được truyền vào có thể nhìn vào bên trong tập dữ liệu để tìm giá trị để liên kết khi được yêu cầu đánh giá.
Điều khó hiểu về tất cả những điều này là chúng có thể được sử dụng để thực hiện một tập hợp con khác. Vì vậy, về bản chất, tất cả chúng là một chút chi tiết thực hiện. Tất cả chúng đều cung cấp giá trị tương tự ở chỗ bạn không cần phải thu thập tất cả các giá trị trả trước và trong đó bạn có thể sử dụng lại một phần của hàm, vì bạn đã phân tách nó thành các đơn vị kín đáo.
Tiết lộ
Tôi không phải là một chuyên gia về chủ đề này, gần đây tôi mới bắt đầu tìm hiểu về những điều này, và vì vậy tôi cung cấp sự hiểu biết hiện tại của mình, nhưng nó có thể có những lỗi mà tôi mời bạn chỉ ra, và tôi sẽ sửa như / nếu Tôi khám phá bất kỳ.