커링
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
커링은 19세기 고틀로프 프레게의 연구에서 기원하여 하스켈 커리에 의해 널리 사용된 개념으로, 함수를 단일 인자를 받는 함수의 체인으로 변환하는 기술이다. 집합론, 함수 공간, 대수적 위상수학, 도메인 이론, 람다 대수, 타입 이론, 논리학, 범주론 등 다양한 수학 및 컴퓨터 과학 분야에서 활용되며, 특히 람다 대수와 타입 이론에서는 여러 인수를 가진 함수를 연구하는 데 중요한 역할을 한다. 커링은 부분 적용과 혼동될 수 있지만, 부분 적용은 함수의 일부 인수에 값을 적용하여 새로운 함수를 생성하는 반면, 커링은 함수를 단일 인자 함수 체인으로 변환한다는 점에서 차이가 있다. 프로그래밍 언어에서는 함수형 프로그래밍에서 중요한 개념으로 사용되며, 튜플 인수와의 관계와 구현 예시를 통해 이해할 수 있다.
커링의 개념은 19세기 고틀로프 프레게의 연구에서 기원을 찾을 수 있으며,[2][3] 모세 숀핀켈이 아이디어를 제시하였고,[12] 하스켈 커리가 광범위하게 사용하여 "커링"이라는 이름이 붙여졌다.[12] "숀핀켈화(Schönfinkelisation)"라는 대체 이름이 제안되기도 하였다.[13]
커링은 함수 가 주어졌을 때, 새로운 함수
커링은 집합론에서 두 집합 사이의 함수 집합 간의 자연스러운 전단사 함수로 설명될 수 있다. 에서 로의 함수들의 집합 와, 에서 에서 로의 함수들의 집합으로의 함수들의 집합 사이에는 다음과 같은 자연 동형이 존재한다.
ML과 하스켈 같은 일부 프로그래밍 언어에서는 여러 인자를 달성하기 위해 거의 항상 커링된 함수를 사용한다.[11] 두 경우 모두 모든 함수가 정확히 하나의 인자를 갖는다. 이 속성은 다중 인자 함수가 일반적으로 커링된 형식으로 표현되는 람다 대수에서 상속된다.
커링과 부분 적용은 종종 혼동되지만, 서로 다른 개념이다.[1][24] 부분 적용은 함수의 일부 인자에 실제 값을 적용하여 더 적은 수의 인자를 받는 새로운 함수를 생성하는 반면, 커링은 함수를 단일 인자 함수의 체인으로 변환한다.
예를 들어, 나눗셈 함수 를 커링한 것을 라고 하면, 는 만을 인수로 받는다. 그리고 로 하면, 는 만을 인수로 받는 새로운 함수가 되며, , 즉 인수의 역수를 반환하는 함수가 된다.
Haskell의 표준 함수 `curry`는 커링과 엄밀하게는 다른 동작을 한다. 이 함수는 `(a, b) -> c` 형식을 가진 함수를 `a -> b -> c` 형식의 함수로 변환하지만, 원래 함수는 "2개의 요소의 튜플을 받는 1인자 함수"이며, 2인자 함수가 아니다. Haskell은 모든 함수가 1인자 함수이며 (즉, 모든 함수가 원래 커링된 형태라고도 표현된다), Haskell 프로그램에서는 엄밀한 의미에서 커링을 수행하는 함수를 정의할 수 없다. 다만, 타입 이론상으로는 `X`, `Y`라는 형식의 요소를 가진 튜플의 형식은 직적 와 거의 동일시할 수 있기 때문에, 반드시 오용이라고 할 수는 없다.[1]
[1]
웹사이트
Currying != Generalized Partial Application?!
http://lambda-the-ul[...]
2007-05-24
2. 역사
"커링"이라는 용어는 크리스토퍼 스트래치가 1967년 강의 노트 프로그래밍 언어의 기본 개념에서 처음 사용했지만,[14] 해당 자료에서는 이 개념을 "숀핀켈이 처음 고안한 장치"로 소개하고 있다.[5] 존 C. 레이놀즈도 1972년 논문에서 "커링"을 정의했지만, 자신이 만든 용어라고 주장하지는 않았다.[6]
3. 정의
:를 구성하는 것이다.
즉, 는 타입의 인수를 받아 타입의 함수를 반환한다. 이는 다음과 같이 정의된다.
:
타입의 와 타입의 에 대해. 또한
:
라고 쓴다.
'''언커링'''은 반대 변환이며, 함수 인 우측 인접성을 통해 가장 쉽게 이해할 수 있다.[11]
4. 이론적 배경
:
이는 함수 집합에 대한 지수 표기법을 정당화하며, 모든 고정된 집합 에 대해, 함자 는 함자 의 왼쪽 수반 함자이다. 집합의 범주에서 대상 는 지수 대상이라고 불린다.
함수 해석학이나 호모토피 이론에서는 위상 공간 사이의 연속 함수에 관심을 가지며, 함수는 에서 로의 전단사 함수이다. 만약 에 콤팩트-열린 위상을 부여하고 가 국소 콤팩트 하우스도르프 공간이면, 는 위상 동형 사상이 된다.[15]
대수적 위상수학에서 커링은 에크만-힐튼 쌍대성의 예시로, 고리 공간은 축소된 현수에 수반된다.[19] 순서론의 격자 이론에서 커링은 스콧 위상이 주어질 때 연속 함수이다.[20]
이론 전산학에서 커링은 여러 인수를 가진 함수를 단일 인수를 받는 함수의 조합으로 연구하는 방법을 제공한다. 예를 들어, 타입의 함수 ''f''의 커리 형태는 와 같이 정의된다.[11]
타입 이론에서 커링은 ML, Haskell 등 프로그래밍 언어의 타입 시스템에 영향을 주었으며, 범주론의 언어와도 관련이 깊다.[11] 커리-하워드 대응에 따르면 커링과 언커링의 존재는 논리적 정리 와 동치이다.[11]
범주론에서 커링은 지수 대상의 보편 성질이며, 데카르트 닫힌 범주에서 수반 관계를 낳는다. 이는 닫힌 모노이드 범주에서 더 광범위하게 일반화될 수 있으며, 텐서 곱과 내부 Hom이 수반 함자라는 명제로 표현된다.[22]
4. 1. 집합론
집합론에서 표기법은 집합 에서 집합 로의 함수들의 집합을 나타내는 데 사용된다. 커링은 에서 로의 함수들의 집합 와, 에서 에서 로의 함수들의 집합으로의 함수들의 집합 사이의 자연적인 전단사 함수이다. 기호로 나타내면 다음과 같다.
:
이 자연적인 전단사 함수는 함수 집합에 대한 지수 표기법을 정당화한다. 커링의 모든 경우에서와 마찬가지로, 위의 공식은 수반 함자 쌍을 설명한다. 즉, 모든 고정된 집합 에 대해, 함자 는 함자 의 왼쪽 수반 함자이다.
집합의 범주에서, 대상 는 지수 대상이라고 불린다.
4. 2. 함수 공간
함수 해석학이나 호모토피 이론에서는 보통 위상 공간 사이의 연속 함수에 대해 관심을 갖는다. 에서 로 가는 모든 함수의 집합을 (Hom 함자)로 나타내고, 연속 함수의 부분 집합을 나타내기 위해 표기법을 사용한다. 여기서 는 다음과 같은 전단사 함수이다.
:
언커링은 역 사상이다. 에서 로 가는 연속 함수 집합 에 콤팩트-열린 위상을 부여하고, 공간 가 국소 콤팩트 하우스도르프 공간인 경우,
:
는 위상 동형 사상이다. 이는 , 및 가 콤팩트 생성 공간일 때도 성립하며,[15] 더 많은 경우에도 성립한다.[16][17][18]
함수가 연속적일 경우에만 그 커리 형태도 연속적이라는 따름 정리가 유용하게 쓰인다. 또 다른 중요한 결과는 이 맥락에서 "평가"라고 불리는 적용 사상이 연속적이라는 것이다(eval은 컴퓨터 과학에서 엄격히 다른 개념임). 즉,
:
가 콤팩트-열린 위상이고 가 국소 콤팩트 하우스도르프 공간일 때 연속적이다.[19] 이 두 결과는 호모토피의 연속성을 확립하는 데 매우 중요하다. 즉, 가 단위 구간 일 때, 는 에서 로 가는 두 함수의 호모토피로 생각할 수 있거나, 그에 상응하여 에서 단일(연속적) 경로로 생각할 수 있다.
4. 3. 대수적 위상수학
대수적 위상수학에서 커링은 에크만-힐튼 쌍대성의 예시로 작용하며, 여러 분야에서 중요한 역할을 한다. 예를 들어, 고리 공간은 축소된 현수에 수반되는데, 이는 일반적으로 다음과 같이 표현된다.[19]
:
여기서 는 사상 의 호모토피류의 집합이고, 는 ''A''의 현수이며, 는 ''A''의 고리 공간이다. 는 와 단위 구간의 데카르트 곱으로, 구간을 고리로 만들기 위한 동치 관계를 갖는다. 커리 형태는 공간 를 고리에서 로의 함수 공간, 즉 에서 로 매핑한다.[19] 는 현수를 고리 공간으로 매핑하는 수반 함자이고, 언커링은 그 쌍대이다.[19]
4. 4. 도메인 이론
순서론의 부분 순서 집합 격자 이론에서 커링은 격자에 스콧 위상이 주어질 때 연속 함수이다.[20] 스콧 연속 함수는 람다 대수의 의미론을 제공하기 위한 시도에서 처음 조사되었다(일반적인 집합론으로는 이를 수행하기에 부적절하다). 스콧 연속 함수는 지시적 의미론 연구를 포함하는 도메인 이론에서 더 일반적으로 연구된다. 스콧 위상은 위상 공간의 범주에서 마주칠 수 있는 많은 일반적인 위상과는 상당히 다르다는 점에 유의해야 한다. 스콧 위상은 일반적으로 상위 위상이며 소버 공간이 아니다.
연속성 개념은 호모토피 유형 이론에서 나타난다. 두 컴퓨터 프로그램이 한 프로그램에서 다른 프로그램으로 "연속적으로" 리팩토링될 수 있다면, 즉 같은 결과를 계산한다면, 호모토픽(동등)하다고 간주할 수 있다.
4. 5. 람다 대수
이론 전산학에서 커링은 람다 대수와 같이 함수가 단일 인수만 받는 매우 단순한 이론적 모델에서 여러 인수를 갖는 함수를 연구하는 방법을 제공한다. 두 개의 인수를 취하는 함수 를 생각해 보자. 이 함수의 유형은 이며, 여기서 ''x''는 유형 를 가져야 하고, ''y''는 유형 를 가져야 하며, 함수 자체는 유형 를 반환하는 것으로 이해해야 한다. ''f''의 커리 형태는 다음과 같이 정의된다.[11]
:
여기서 는 람다 대수의 추상자이다. curry는 유형이 인 함수를 입력으로 사용하므로 curry 자체의 유형은 다음과 같다.
:
→ 연산자는 종종 우측 결합으로 간주되므로 커리 함수 유형 는 종종 로 작성된다. 반대로, 함수 적용은 좌측 결합으로 간주되므로 는 다음과 같다.
:.
즉, 괄호는 적용 순서를 모호하지 않게 하기 위해 필요하지 않다.
커리 함수는 클로저를 지원하는 모든 프로그래밍 언어에서 사용할 수 있다. 그러나 부분 적용 및 클로저 생성의 오버헤드를 대부분의 함수 호출에서 피할 수 있으므로 효율성 측면에서 커리되지 않은 함수가 일반적으로 선호된다.[1][24]
4. 6. 타입 이론
타입 이론에서 컴퓨터 과학의 타입 시스템에 대한 일반적인 아이디어는 특정 타입의 대수로 공식화된다. 예를 들어, 라고 쓸 때, 와 는 타입이고, 화살표 는 타입 생성자이며, 특히 함수 타입 또는 화살표 타입이다. 마찬가지로, 타입의 데카르트 곱 는 곱 타입 생성자 에 의해 구성된다.[11]
이러한 타입 이론적 접근 방식은 ML, Caml, Haskell, F#과 같이 ML에서 파생되고 영감을 받은 프로그래밍 언어에서 표현된다.[11]
타입 이론적 접근 방식은 범주론의 언어에 자연스러운 보완을 제공하는데, 이는 범주, 특히 모노이드 범주가 내부 언어를 가지고 있으며, 단순 타입 람다 계산이 이러한 언어의 가장 두드러진 예이기 때문이다. 이는 단일 타입 생성자인 화살표 타입에서 구축될 수 있기 때문에 이 맥락에서 중요하다. 그런 다음 커링은 해당 언어에 자연스러운 곱 타입을 부여한다. 범주의 객체와 타입 간의 대응은 프로그래밍 언어를 논리(커리-하워드 대응을 통해) 및 기타 유형의 수학적 시스템으로 재해석할 수 있게 한다.[11]
4. 7. 논리학
커리-하워드 대응에 따르면 커링과 언커링의 존재는 논리적 정리 (수출이라고도 함)와 동일하다.[11] 여기서 튜플(곱 유형)은 논리적 결합에 해당하고, 함수 유형은 함의에 해당한다.
4. 8. 범주론
범주론에서 커링은 지수 대상의 보편 성질이며, 데카르트 닫힌 범주에서 수반 관계를 낳는다. 즉, 이진 곱 에서 사상으로, 지수 대상 으로의 사상 사이에는 자연스러운 동형 사상이 존재한다.[22]
이는 닫힌 모노이드 범주에서 더 광범위한 결과로 일반화된다. 커링은 텐서 곱과 내부 Hom이 수반 함자라는 명제이다. 즉, 모든 대상 에 대해 다음과 같은 자연 동형 사상이 존재한다.[22]
:
여기서 ''Hom''은 범주 내의 모든 사상의 (외부) Hom-함자를 나타내고, 는 닫힌 모노이드 범주 내의 내부 hom 함자를 나타낸다. 집합 범주의 경우, 둘은 동일하다. 곱이 데카르트 곱일 때, 내부 hom 는 지수 대상 가 된다.[22]
커링은 두 가지 방식으로 붕괴될 수 있다. 하나는 범주가 닫혀 있지 않아 내부 hom 함자가 없을 때 (그러한 함자에 대한 선택이 여러 개 있을 수 있기 때문)이다. 또 다른 방식은 범주가 모노이드가 아니어서 곱을 갖지 못할 때(즉, 대상 쌍을 작성할 방법이 없을 때)이다. 곱과 내부 hom을 모두 갖는 범주는 정확히 닫힌 모노이드 범주이다.[22]
데카르트 닫힌 범주의 설정은 고전 논리를 논의하기에 충분하며, 보다 일반적인 닫힌 모노이드 범주의 설정은 양자 계산에 적합하다.[22]
이 둘의 차이점은 데카르트 범주(예: 집합 범주, 완비 부분 순서 또는 헤이팅 대수)의 곱은 단순히 데카르트 곱이라는 것이다. 이것은 항목의 순서쌍 (또는 목록)으로 해석된다. 단순 타입 람다 계산은 데카르트 닫힌 범주의 내부 언어이며, 이러한 이유로 쌍과 목록은 LISP, Scheme 및 많은 함수형 프로그래밍 언어의 타입 시스템에서 주요 타입이다.[22]
반대로, 모노이드 범주(예: 힐베르트 공간 및 함수 해석학의 벡터 공간)의 곱은 텐서 곱이다. 이러한 범주의 내부 언어는 선형 논리, 즉 양자 논리의 한 형태이며, 해당 타입 시스템은 선형 타입 시스템이다. 이러한 범주는 얽힌 양자 상태를 설명하는 데 적합하며, 더 일반적으로 Curry–Howard 대응을 양자 역학, 대수적 위상수학의 코보디즘, 끈 이론으로 광범위하게 일반화할 수 있다.[23] 선형 타입 시스템 및 선형 논리는 상호 배타적 잠금과 같은 동기화 기본 요소 및 자동 판매기의 작동을 설명하는 데 유용하다.[23]
5. 프로그래밍 언어에서의 커링
커링은 부분 적용과 관련이 있지만 동일하지는 않다.[1][24] 실제로는 클로저 프로그래밍 기법을 사용하여 부분 적용과 일종의 커링을 수행할 수 있다. 이는 커링된 함수와 함께 이동하는 환경에서 인자를 숨김으로써 가능하다.
6. 부분 적용과의 비교
예를 들어, 함수 가 주어졌을 때, 커링은 을 생성한다. 커링된 함수를 평가하려면 각 인자를 차례로 적용해야 한다. 예를 들어, 은 커링된 함수에서는 으로 표현된다. 을 호출하면 단일 인자를 받아 다른 함수를 반환하는 함수가 남는다.
반면, 부분 함수 적용은 함수에 여러 개의 인자를 고정하여 더 작은 인자 수를 가진 다른 함수를 생성한다. 위에서 정의된 를 사용하면 첫 번째 인자를 고정하여 유형의 함수를 생성할 수 있다. 이 함수의 평가는 으로 표시될 수 있다. 부분 함수 적용의 결과는 즉시 결과를 반환하는 반면, 커링된 함수는 인자가 모두 적용될 때까지 함수를 반환한다.[25]
부분 적용의 실질적인 예로, 1을 첫 번째 인수로 바인딩하여 덧셈 연산자를 나타내는 함수를 쉽게 정의할 수 있다.
부분 적용은 고정 지점에서 커링된 함수를 평가하는 것으로 볼 수 있다. 예를 들어, 이고 인 경우 또는 간단히 인데, 여기서 은 f의 첫 번째 매개변수를 커링한다.
Groovy와 같은 일부 프로그래밍 언어에서는 부분 적용을 수행하는 메서드에 `curry`라는 이름이 붙어 있어 혼동을 유발할 수 있다.[26][27]
7. 구현 예시
이 예는 Scheme와 JavaScript로 구현할 수 있다.[1]
8. 튜플 인수와의 관계
참조
[2]
서적
Grundgesetze der arithmetik
http://archive.org/d[...]
Hermann Pohle
[3]
서적
From Frege to Gödel: A Source Book in Mathematical Logic, 1879-1931
Harvard University Press
[4]
간행물
Über die Bausteine der mathematischen Logik
http://www.cip.ifi.l[...]
Springer
1924-09
[5]
간행물
Fundamental Concepts in Programming Languages
https://doi.org/10.1[...]
2000-04
[6]
서적
Proceedings of the ACM annual conference - ACM '72
https://surface.syr.[...]
ACM Press
1972-08-01
[7]
서적
Formal Syntax and Semantics of Programming Languages: A Laboratory Based Approach
https://cdn.preterhu[...]
Addison-Wesley Publishing Company
[8]
웹사이트
Currying Schonfinkelling
http://wiki.c2.com/?[...]
Cunningham & Cunningham, Inc.
2012-05-06
[9]
서적
Introduction to Lambda Calculus
https://www.cse.chal[...]
2000-03
[10]
서적
Combinatory logic
North-Holland Publishing Company
[11]
웹사이트
Frequently Asked Questions for comp.lang.functional, 3. Technical topics, 3.2. Currying
http://www.cs.nott.a[...]
2002-11
[12]
간행물
Some Philosophical Aspects of Combinatory Logic
North-Holland Publishing Company, imprint of Elsevier
1980
[13]
서적
Semantics in Generative Grammar
https://cs.brown.edu[...]
Blackwell Publishers, an imprint of Wiley
1998-01-02
[14]
웹사이트
Programming language, Currying, or Schonfinkeling?, #9 / 14
http://computer-prog[...]
2022-03-03
[15]
서적
A concise course in algebraic topology
http://www.math.uchi[...]
University of Chicago Press
1999
[16]
웹사이트
compactly generated topological space
https://ncatlab.org/[...]
2023-05-28
[17]
간행물
Monoidal closed, Cartesian closed and convenient categories of topological spaces
https://msp.org/pjm/[...]
Mathematical Sciences Publishers
[18]
웹사이트
convenient category of topological spaces
https://ncatlab.org/[...]
2023-08-11
[19]
서적
An introduction to algebraic topology
https://books.google[...]
Springer-Verlag
1988
[20]
서적
The lambda calculus: its syntax and semantics
North-Holland, an imprint of Elsevier
1984
[21]
서적
Sheaves in Geometry and Logic: A First Introduction to Topos Theory
null
Springer-Verlag, part of Springer Science & Business Media
1992
[22]
Conference
" Logic in Computer Science (LICS 2004): Proceedings, 19th Annual IEEE Symposium, Turku, Finland, 2004"
IEEE Computer Society Press
2007-03-05
[23]
서적
New Structures for Physics
https://math.ucr.edu[...]
Springer
2022-12-05
[24]
웹사이트
Partial Function Application is not Currying
https://www.uncarved[...]
2016-10-23
[25]
웹사이트
Functional Programming in 5 Minutes
http://slid.es/gskle[...]
2013-05-15
[26]
URL
http://lambda-the-ul[...]
[27]
URL
http://www.uncarved.[...]
[28]
문서
"[[C++11]]で非推奨、[[C++17]]で削除"
[29]
간행물
Fundamental Concepts in Programming Languages
[30]
간행물
Definitional Interpreters for Higher-Order Programming Languages
[31]
문서
Kenneth Slonneger and Barry L. Kurtz. ''Formal Syntax and Semantics of Programming Languages''. p. 144.
[32]
문서
Henk Barendregt, Erik Barendsen, "[ftp://ftp.cs.ru.nl/pub/CompMath.Found/lambda.pdf Introduction to Lambda Calculus]{{깨진 링크|url=ftp://ftp.cs.ru.nl/pub/CompMath.Found/lambda.pdf }}", March 2000, page 8.
[33]
서적
Combinatory logic
North-Holland Publishing Company
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com