부분적용
Partial application컴퓨터 과학에서 부분적 응용(또는 부분적 함수 응용)은 함수에 다수의 주장을 고정시켜 더 작은 아성의 또 다른 기능을 만들어 내는 과정을 말한다.Given a function , we might fix (or 'bind') the first argument, producing a function of type . Evaluation of this function might be represented as ,) 이 경우 부분함수 적용의 결과는 두 개의 인수를 취하는 함수라는 점에 유의한다.부분적 응용은 때때로 관련성이 있지만 뚜렷한 개념인 커링이라고 잘못 불리고 있다.
동기
직관적으로 부분함수 적용은 "함수의 첫 번째 인수를 고치면 나머지 인수의 함수를 얻게 된다"고 말한다.예를 들어, 함수 div(x,y) = x/y인 경우, 매개변수 x가 1에 고정된 div는 div1(y) = div(1,y) = 1/y인 또 다른 함수다.이것은 인수의 곱셈 역수를 반환하는 함수 inv와 동일하며, inv(y) = 1/y로 정의된다.
부분적용에 대한 실제적인 동기는 거의 모든 인수를 함수에 공급하여 얻은 함수가 유용하다는 것이다. 예를 들어, 많은 언어들은 유사한 함수나 연산자를 가지고 있다.plus_one. 부분적 응용은 예를 들어 첫 번째 인수로 1바운드로 추가 연산자를 나타내는 함수를 생성함으로써 이러한 함수를 쉽게 정의할 수 있게 한다.
구현
ML, Haskell, F#와 같은 언어에서 함수는 기본적으로 커리어의 형태로 정의된다.총 인수 수보다 적은 수의 인수를 제공하는 것을 부분 적용이라고 한다.
1급 함수를 가진 언어에서는 정의 할 수 있다.curry,uncurry그리고papplyCurring and partial apply를 명시적으로 수행한다.이것은 추가적인 폐쇄의 생성으로 인해 런타임 오버헤드가 더 커질 수 있는 반면, Haskell은 더 효율적인 기법을 사용할 수 있다.[1]
스칼라는 자리 표시자와 함께 선택적 부분 응용 프로그램을 구현한다.def add(x: Int, y: Int) = {x+y}; add(1, _: Int)증분 함수를 반환한다.스칼라는 또한 여러 매개변수 리스트를 커리어로 지원한다.def add(x: Int)(y: Int) = {x+y}; add(1) _.
Clojure는 다음을 사용하여 부분적 응용을 구현partial핵심 라이브러리에 정의된 기능.[2]
C++ 표준 라이브러리가 제공하는 기능bind(function, args..)주어진 인수를 주어진 함수에 부분적으로 적용한 결과인 함수 객체를 반환한다.또는 람다 식을 사용할 수 있다.
인트로 f(인트로 a, 인트로 b); 자동차로 f_message = [](인트로 a) { 돌아오다 f(a, 123); }; 주장하다(f_message(456) == f(456, 123) ); 자바에서는MethodHandle.bindTo첫 번째 주장에 함수를 부분적으로 적용한다.[3]또는 Java 8부터 람다(lamdas)를 사용할 수 있다.
공중의 정태의 <A, B, R> 함수<B, R> 부분적용(바이펑션<A, B, R> 비펑크, A 가치를 매기다) { 돌아오다 b -> 비펑크.신청하다(가치를 매기다, b); } 라쿠에서 방법은 매개변수가 적은 새로운 함수를 생성한다.[4]
Python 표준 라이브러리 모듈functools을 포함하다partial함수, 위치 및 명명된 인수 바인딩 허용, 새 함수 반환.[5]
XQuery에서 인수 자리 표시자(?부분 함수 응용 프로그램에서 고정되지 않은 각 인수에 사용된다.[6]
정의들
함수형 및 제품형식(λλ형→,×) 부분 적용이 있는 단순형 람다 미적분학에서, 커리어와 커리어를 다음과 같이 정의할 수 있다.
papply- ((a × b) → c) × a) → (b → c) = λ(f, x)λy. f (x, y)
curry- ((a × b) → c) → (a → (b → c) = λf. λx. λy. f (x, y)
uncurry- (a → (b → c) → (a × b) → c) = λf. λ(x, y). f x y
참고:curry papply=curry.
참고 항목
- η-conversion
- POP-2
- 제한(수학), 함수를 도메인의 하위 집합으로 제한하는 일반적인 현상
참조
- ^ 말로 & 페이튼 존스 2004
- ^ "clojure/clojure, partial function". GitHub. Retrieved 2020-07-18.
{{cite web}}: CS1 maint : url-status (링크) - ^ "MethodHandle (Java Platform SE 7)". docs.oracle.com. Retrieved 2018-09-12.
- ^ "Method assuming". docs.perl6.org. Retrieved 2018-09-12.
- ^ "10.2. functools — Higher-order functions and operations on callable objects — Python 3.7.0 documentation". docs.python.org. Retrieved 2018-09-12.
- ^ "XQuery 3.1: An XML Query Language". www.w3.org. Retrieved 2018-09-12.
추가 읽기
- Marlow, Simon; Peyton Jones, Simon (2004), "Making a Fast Curry: Push/Enter vs. Eval/Apply for Higher-order Languages", ICFP '04 Proceedings of the ninth ACM SIGPLAN international conference on Functional programming
- 벤자민 C. Pierce et al. "부품 애플리케이션", 2016-05-21 Wayback Machine "소화: Curring"에 보관.웨이백 머신 소프트웨어 재단에 2016-05-21 보관.
외부 링크
- Rosetta 코드의 부분 기능 적용.
- Haskell Wiki의 부분 적용
- Haskell Wiki의 상시 적용 양식
- 너무 편파적이 되는 것의 위험성