나의 제한된 이해는 다음과 같습니다.
1) 부분 기능 적용
부분 함수 응용 프로그램 은 더 적은 수의 인수를 사용하는 함수를 반환하는 프로세스입니다. 3 개 중 2 개의 인수를 제공하면 3-2 = 1 개의 인수를 취하는 함수가 반환됩니다. 3 개 중 1 개의 인수를 제공하면 3-1 = 2 개의 인수를 취하는 함수가 반환됩니다. 원하는 경우 3 개 중 3 개의 인수를 부분적으로 적용 할 수 있으며 인수가없는 함수를 반환합니다.
따라서 다음 기능이 주어집니다.
f(x,y,z) = x + y + z;
1을 x에 바인딩하고 위의 함수에 부분적으로 적용하면 다음과 같은 f(x,y,z)
이점이 있습니다.
f(1,y,z) = f'(y,z);
어디: f'(y,z) = 1 + y + z;
이제 y를 2에 바인딩하고 z를 3에 바인딩하고 부분적으로 적용 f'(y,z)
하면 다음을 얻을 수 있습니다.
f'(2,3) = f''();
어디에 : f''() = 1 + 2 + 3
;
이제 어떤 시점에서, 당신은 평가하도록 선택할 수 있습니다 f
, f'
또는 f''
. 그래서 할 수 있습니다 :
print(f''()) // and it would return 6;
또는
print(f'(1,1)) // and it would return 3;
2) 카레
반면에 카레 는 함수를 하나의 인수 함수의 중첩 된 체인으로 분할하는 프로세스입니다. 둘 이상의 인수를 제공 할 수 없으며 1 또는 0입니다.
따라서 동일한 기능이 주어집니다.
f(x,y,z) = x + y + z;
당신이 그것을 커리면, 당신은 세 가지 기능의 체인을 얻을 것입니다 :
f'(x) -> f''(y) -> f'''(z)
어디:
f'(x) = x + f''(y);
f''(y) = y + f'''(z);
f'''(z) = z;
이제 전화 f'(x)
하면 x = 1
:
f'(1) = 1 + f''(y);
새로운 기능이 반환됩니다.
g(y) = 1 + f''(y);
당신이 전화 g(y)
하면 y = 2
:
g(2) = 1 + 2 + f'''(z);
새로운 기능이 반환됩니다.
h(z) = 1 + 2 + f'''(z);
마지막으로 전화 h(z)
하면 z = 3
:
h(3) = 1 + 2 + 3;
당신은 반환 6
됩니다.
3) 폐쇄
마지막으로 폐쇄 는 함수와 데이터를 단일 단위로 캡처하는 프로세스입니다. 함수 클로저는 0에서 무한한 수의 인수를 취할 수 있지만 전달되지 않은 데이터도 알고 있습니다.
다시 말하지만 동일한 기능이 주어집니다.
f(x,y,z) = x + y + z;
대신 클로저를 작성할 수 있습니다.
f(x) = x + f'(y, z);
어디:
f'(y,z) = x + y + z;
f'
에 닫힙니다 x
. f'
내부의 x 값을 읽을 수 있음을 의미합니다 f
.
그래서 만약 당신이 전화를했다 f
와 함께 x = 1
:
f(1) = 1 + f'(y, z);
당신은 폐쇄를 얻을 것이다 :
closureOfF(y, z) =
var x = 1;
f'(y, z);
그리고 당신 closureOfF
이 y = 2
and로 전화하면 z = 3
:
closureOfF(2, 3) =
var x = 1;
x + 2 + 3;
어느 것이 돌아 올까 6
결론
카레, 부분 적용 및 클로저는 기능을 더 많은 부분으로 분해한다는 점에서 다소 유사합니다.
Currying은 여러 인수의 함수를 단일 인수의 함수를 반환하는 단일 인수의 중첩 함수로 분해합니다. 이해가되지 않기 때문에 하나 또는 그 이상의 논증의 함수를 카레 할 필요는 없습니다.
부분 응용 프로그램은 여러 인수의 함수를 현재 누락 된 인수가 제공된 값으로 대체 된 더 작은 인수의 함수로 분해합니다.
클로저는 함수를 함수와 함수로 분해하여 전달되지 않은 함수 내부의 변수가 데이터 세트 내부를 조사하여 평가 요청시 바인딩 할 값을 찾을 수있는 데이터 세트로 분해합니다.
이 모든 것들에 대해 혼란스러운 것은 그것들이 각각 다른 것들의 부분 집합을 구현하는데 사용될 수 있다는 것입니다. 본질적으로 그것들은 모두 약간의 구현 세부 사항입니다. 그것들은 모든 값을 미리 모을 필요가 없으며 기능의 일부를 신중한 단위로 분해했기 때문에 재사용 할 수 있다는 점에서 비슷한 가치를 제공합니다.
폭로
나는 결코 주제의 전문가가 아니며, 최근에 이것들에 대해 배우기 시작했으며, 따라서 현재의 이해를 제공하지만 실수로 지적 할 수있는 실수가있을 수 있습니다. 나는 무엇이든 발견한다.