Có hàm f lấy các đối số x 1 , x 2 , Hoài, x n
- I E. f: X 1 × X 2 × ngày × X n → Y
- tách lạng bộ định nghĩa lại f là một hàm tham gia một đối số duy nhất một 1 mà bản đồ để với chức năng khác. Kỹ thuật này hữu ích cho ứng dụng một phần, ví dụ với pow
chức năng được xử lý, chúng ta có thể viếtexp = pow(e)
.
Thí dụ
Giả sử chúng ta có hàm sau f lấy ba đối số ( f: X 1 × X 2 × X 3 → Y ):
def f(a,b,c):
return a + b * c
Currying hàm này để lại cho chúng ta f_curry: X 1 → (X 2 → (X 3 → Y)) , nếu bây giờ chúng ta gọi hàm đó hai lần với f_curry(1)(2)
chúng ta sẽ nhận được một hàm ( h
) tương đương với hàm được trả về sau:
def h(c):
return 1 + 2 * c
Hàm curried f
có thể được viết như thế này (Python 3):
def f_curry(a):
def g_curry(b):
def h(c):
return a + b * c
return h
return g_curry
Thử thách
Thử thách của bạn sẽ là cà ri một chức năng như được mô tả ở trên, đây là các quy tắc:
- Đầu vào sẽ là một hàm hộp đen có ít nhất 2 đối số
- Hàm đầu vào sẽ luôn có một số lượng đối số cố định (không giống
printf
hoặc tương tự, lưu ý: bạn cần hỗ trợ các hàm với bất kỳ số lượng đối số 2) - Nếu ngôn ngữ của bạn sử dụng các hàm được xử lý theo mặc định (ví dụ: Haskell), bạn có thể mong đợi chức năng nhập được xác định qua N -tuples, thay vì "hàm bậc cao hơn"
- Bạn có thể lấy số lượng đối số làm đầu vào
- Đầu ra sẽ tương đương với đầu vào *
- Bạn có thể cho rằng hàm đầu ra sẽ chỉ là:
- được gọi với ít hơn hoặc bằng số lượng đối số mà hàm đầu vào
- được gọi với các đối số đúng loại
* Điều này có nghĩa là cho một đầu vào f
có N
đối số và đầu ra h
cho tất cả các đối số hợp lệ, a1,…,aN
nó giữ điều đó f(a1,a2,…,aN) == h(a1)(a2)…(aN)
.
def f(a,b,c): return a + b * c
và đầu ra là def f_curry(a): def g_curry(b): def h(c): return a + b * c return h return g_curry
?
f
(được xác định ở đâu đó) và đầu ra phải tương đương với f_curry
. Hoặc đầu vào sẽ là lambda a,b,c: a+b*c
và đầu ra một chức năng tương đương f_curry
.