다형성과 시스템 F(Polymorphism and System F)
타입(type) 변수에 '모든 X에 대해'를 붙여 한 프로그램이 모든 타입에서 같은 방식으로 일하게 하는 것. 같은 방식이어야 한다는 제약 덕분에 타입만 보고도 프로그램에 대한 정리를 얻는다.
리스트를 뒤집는 함수(function) reverse를 생각해 봅시다. [3, 1, 4]를 넣으면 [4, 1, 3]이, ["가", "나"]를 넣으면 ["나", "가"]가 나옵니다. 원소(element)가 정수(integer)이든 글자이든 코드는 한 글자도 다르지 않습니다. 원소를 들여다보지 않고 자리만 옮기기 때문입니다. 단순 타입 람다 계산(simply typed lambda calculus)에서는 이런 함수에 타입 하나를 줄 수 없어서, 정수용 reverse와 글자용 reverse를 따로 써야 합니다. 이 함수의 참된 타입은
이것을 계산 체계로 다듬은 것이 시스템 F입니다. 프랑스 논리학자 장이브 지라르는 1972년 2차 산술의 증명을 연구하다가, 미국의 존 레이놀즈는 1974년 프로그래밍 언어를 연구하다가, 서로 모르고 같은 체계에 이르렀습니다. 단순 타입 람다 계산에 타입 변수 X와 타입
예를 들어
타입이 프로그램을 센다. 타입이
매개변수성(parametricity)과 공짜 정리(free theorem). 레이놀즈는 1983년 이 직관을 정리로 만들었습니다(추상화 정리, abstraction theorem). 다형 함수를 두 타입 A와 B에서 쓸 때, A의 원소와 B의 원소 사이에 어떤 관계를 잡든 관계된 입력은 관계된 출력으로 간다는 것입니다. 1989년 필립 와들러는 여기서 타입만 보고 정리를 뽑아내는 방법을 보이고, 이를 '공짜 정리'(Theorems for free!)라 불렀습니다. 예를 들어 r의 타입이
원소를 먼저 f로 바꾸고 r을 하든, r을 먼저 하고 원소를 바꾸든 같습니다. r은 리스트의 길이만 보고 어느 자리를 남기고 버리고 되풀이할지 정할 수 있을 뿐, 원소의 값에 따라 행동을 바꿀 수 없기 때문입니다. 증명의 뼈대는 한 줄입니다. A와 B 사이의 관계로 'b = f(a)'를 잡으면, 두 리스트가 원소별로 관계된다는 것은 둘째가 첫째에 map f를 한 것이라는 뜻입니다. 추상화 정리는 r의 두 출력도 그렇게 관계된다고 말해 주고, 그것이 위의 등식입니다. 같은 방법으로
r은
그림의 네모는 범주론(category theory)의 말로 하면 자연성(naturality) 사각형입니다. List는 타입 A를 List A로, 함수 f를 map f로 보내는 함자(functor)이고, 공짜 정리는 다형 함수 r이 함자 List에서 List로 가는 자연 변환(natural transformation)이라는 말과 같습니다. 정렬처럼 원소를 비교하는 함수는 타입이
다형성의 세 갈래. 영국의 크리스토퍼 스트레이치는 1967년 강의 노트에서 매개변수 다형성과 임시(ad hoc) 다형성을 나누었습니다. 임시 다형성(ad hoc polymorphism)은 + 하나가 정수에서는 덧셈을, 문자열에서는 이어 붙이기를 하듯 타입마다 다른 코드가 불리는 오버로딩입니다. Haskell의 타입 클래스(type class)는 이것을 규칙 있게 만든 것입니다. 객체 지향 언어의 하위 타입(subtype) 다형성은 '개는 동물이다'처럼 더 구체적인 타입의 값을 더 일반적인 타입의 자리에 쓰는 것입니다. 이름은 같아도 약속이 다릅니다. 공짜 정리 같은 보증은 '모든 타입에서 같은 코드'라는 매개변수 다형성의 약속에서만 나옵니다.
존재 타입(existential type)과 논리. ∀의 짝은 ∃입니다.
이어지는 곳. 다형성의 출발점인 타입 규칙은 단순 타입 람다 계산에 있고, 실용 언어가 ∀를 어디까지 허용하고 어떻게 저절로 찾아 주는지는 힌들리–밀너 타입 추론(type inference)에서 이어집니다. 처치 수(Church numeral)와 처치의 참·거짓이 시스템 F에서 비로소 제 타입을 얻는다는 점에서 람다 계산과 다시 만납니다. 공짜 정리의 네모는 자연 변환의 정의 그 자체이고, map이 항등과 합성을 지킨다는 성질이 List를 함자로 만듭니다. 리스트 같은 타입을 1 + X × L처럼 세는 방법은 대수적 자료형(algebraic data type)에서 다룹니다. ∀가 타입뿐 아니라 값까지 받을 수 있게 하면 의존 타입(dependent type)이 되고, 거기서 ∀는 명제의 '모든'이 됩니다. 지라르는 타입의 타입을 허용하면(Type : Type) 체계가 모순이 된다는 것도 보였는데, 이것은 러셀의 역설(Russell's paradox)과 같은 계열의 '너무 큰 모임' 역설이 타입 이론(type theory)에서 다시 나타난 것입니다. 시스템 F의 강정규화는 2차 산술의 무모순성(consistency)을 함축하므로, 괴델의 불완전성 정리(Gödel's incompleteness theorems)에 따라 2차 산술 안에서는 증명할 수 없습니다. 타입 변수에 상한(upper bound)을 두는 한정 양화(bounded quantification)
이 개념이 나오는 긴 글
이 개념을 언급하는 페이지
- 타입 이론
… 의존의 방향을 셋 더할 수 있습니다. 타입을 받는 항(모든 타입 X에 대해 X → X인 항등 함수처럼,다형성), 타입을 받는 타입(타입 A를 받아 'A들의 리스트' 타입을 만드는 List처럼, 타입 연산자), 항을 …
- 단순 타입 람다 계산
… 타입을 찾아내는 방법이 힌들리–밀너 타입 추론입니다. 타입 변수와 '모든 타입에 대해'를 더하면시스템 F가 되고, 강정규화는 유지되지만 증명은 훨씬 어려워집니다. 모든 계산이 끝난다는 보장과 튜링 완전성이 …
- 커리–하워드 대응
… 아니라 체계 사이의 대응들의 묶음입니다. 단순 타입 람다 계산은 직관주의 명제 논리의 '이면' 조각에,시스템 F는 2차 명제 논리에, 의존 타입 체계는 술어 논리에, 지라르의 선형 논리(1987)는 자원을 정확히 …
- 대수적 자료형
… 같은 원리에서 나옵니다. 타입 변수를 넣어 '모든 A에 대해 A의 리스트'를 한 번에 다루는 것이다형성입니다. 되부르는 타입이 방정식 L\cong 1 + A\times L 의 가장 작은 해, 곧 ⟦시작 …
- 타입 추론: 힌들리–밀너
… 다뤄지는데, α가 Int이면서 Bool일 수는 없기 때문입니다. 함수의 인자까지 다형적으로 받게 하면시스템 F가 되지만, 시스템 F에서 타입을 적지 않은 식의 타입을 찾는 문제는 판정 불가능하다는 것을 1994년 …
- 함자
… 재귀적으로 정의되는 타입의 대표적인 예이고, 모든 타입에 대해 똑같이 작동하는 map이 어떻게 가능한지는다형성에서 이어집니다. 기본군이 보여 준 '공간을 대수로 옮기기'는 위상수학과 표현 바꾸기에서 더 볼 수 …
- 자연 변환
… 내는 필립 와들러의 1989년 논문 「공짜 정리」(Theorems for free!)가 이 이야기입니다(다형성). 앞의 '가장 큰 값'은 원소끼리 비교할 수 있어야 하므로 List a → Maybe a 타입으로는 …
- 요네다 보조정리
… 프로그래밍 방식이 이것에 기댑니다. 모든 타입에서 똑같이 작동한다는 조건이 자연성을 보장한다는 것은다형성의 매개변수성 이야기입니다. 요네다 보조정리는 일본의 수학자 요네다 노부오의 이름을 땄습니다. 그가 …
- 선형 논리와 선형 타입
… 표에서 ×를 ⊗로, →를 ⊸로 바꾼 것이며, 지라르가 이 논리에 이르기까지의 이야기는 장이브 지라르와시스템 F에 있습니다. !로 보통의 논리를 되찾는 번역은 직관주의 논리를 한 번 더 들여다보게 해 줍니다. 끈 …
- 하위 타입과 공변·반변
… 타입은 다른 개념입니다. 물려받은 메서드의 인자를 좁히면 상속은 되어도 하위 타입은 깨집니다. 하위 타입은다형성과 만나면 어려워집니다. '동물의 하위 타입인 모든 X에 대해'라는 뜻의 \forall X \le …