인수 x 1 , x 2 ,…, x n 을 취하는 함수 f가 있음
– 즉. f : X 1 × X 2 ×… × X n → Y
– 카레는 f 를 하나의 인수 a 1 을 취하는 함수로 재정의 합니다. 이 기술은 예를 들어 pow
우리가 작성할 수 있는 카레 함수 와 같은 부분 적용에 유용합니다 exp = pow(e)
.
예
다음 함수 f 가 세 개의 인수 ( f : X 1 × X 2 × X 3 → Y )를 취하는 것으로 가정합니다 .
def f(a,b,c):
return a + b * c
이 함수를 커리하면 f_curry : X 1 → (X 2 → (X 3 → Y)) 가 남습니다. 이제이 함수를 두 번 호출 하면 다음과 같은 f_curry(1)(2)
함수 ( h
)를 얻게됩니다 .
def h(c):
return 1 + 2 * c
커리 함수 f
는 다음과 같이 작성할 수 있습니다 (Python 3).
def f_curry(a):
def g_curry(b):
def h(c):
return a + b * c
return h
return g_curry
도전
당신의 도전은 위에서 설명한대로 기능을 카레하는 것입니다, 여기에 규칙이 있습니다 :
- 입력은 최소한 2 개의 인수를 취하는 블랙 박스 함수 입니다.
- 입력 함수는 항상 고정 된 수의 인수를 갖습니다 (주와는 달리
printf
, 참고 : 인수가 ≥2 인 함수를 지원해야 함) - 언어에서 기본적으로 카레 함수를 사용하는 경우 (예 : Haskell) "고차 함수"대신 입력 함수가 N- 튜플을 통해 정의 될 수 있습니다.
- 인수의 수를 입력으로 사용할 수 있습니다
- 출력은 입력의 카레에 상응하는 값이됩니다 *
- 출력 기능은 다음과 같습니다.
- 입력 함수가 취하는 인수의 수와 같거나 적다
- 올바른 유형의 인수와 함께 호출
* 이것은 인수가 있는 입력 f
과 모든 유효한 인수에 대한 N
출력을 h
의미 a1,…,aN
합니다 f(a1,a2,…,aN) == h(a1)(a2)…(aN)
.
def f(a,b,c): return a + b * c
있고 출력이 def f_curry(a): def g_curry(b): def h(c): return a + b * c return h return g_curry
?
f
(어딘가에 정의되어 있음) 출력 은와 같습니다 f_curry
. 또는 입력은 lambda a,b,c: a+b*c
이고 출력은에 해당하는 함수 f_curry
입니다.