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 powchứ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 fcó 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
printfhoặ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 fcó Nđối số và đầu ra hcho tất cả các đối số hợp lệ, a1,…,aNnó giữ điều đó f(a1,a2,…,aN) == h(a1)(a2)…(aN).
def f(a,b,c): return a + b * cvà đầ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*cvà đầu ra một chức năng tương đương f_curry.