프로그래밍 언어의 타입 이론에서 레코드 타입과 변이체에 대해 구조적으로 다형적인 프로그램을 작성할 수 있게 하는 다형성의 한 종류.
위키백과, 우리 모두의 백과사전
프로그래밍 언어타입 이론에서 행 다형성은 다형성의 한 종류로, 레코드 타입 및/또는 변이체에 대해 구조적으로[1] (명목적으로가 아니라) 다형적인 프로그램을 작성할 수 있게 한다.[2]
레코드에 대한 행 다형적 타입 시스템과 타입 추론의 증명은 Mitchell Wand가 도입하였다.[3][4]
행 다형성의 이론적 취급은 레코드 안에서 레이블이 서로 달라야 한다는 필요 때문에 다소 복잡해진다. Rémy와 동료들이 취한 한 가지 접근법은(그리고 아래의 설명에도 암묵적으로 나타나며, 이는 Wand의 설명에서 강하게 영감을 받았다) 레이블에 따라 서로 다른 행 타입의 종(kind)을 고려하는 것이다.[2]
Gaster와 Jones는 이 접근을 변이체에도 비형식적으로 확장하여, 레코드와 변이체 타입 생성자가 모두 행의 kind에서 타입으로 사상되도록 하였다.[5]
Blume 등은 continuation을 case-matching 코드에서 조합하기 위해 LetCC 구문이 처리하는 “일급 케이스(first-class cases)”를 추가함으로써, 이 접근을 조합 가능한 확장의 영역으로 한 걸음 더 밀고 나갈 것을 제안했다.[6] 이후 몇몇 프로젝트(Links, Koka)는 행 다형성을 대수적 효과 시스템의 타입 기반으로 사용하여, 사용자가 정의한 효과의 “자유로운 조합”을 목표로 삼았다.[7][8]
고유한 레이블 문제에 대한 또 다른 접근은 system F를 “coherent merge” 연산자로 확장하는 것으로, 이로부터 이른바 서로소 교차 타입을 갖는 계산 체계가 나온다.[9]
Morris와 McKinna는 행 타입을 행 이론으로 일반화하여, 하나의 이론적 틀 안에서 (레코드) 확장에 대한 다양한 개념을 일관되게 다루었다. 예를 들어 어떤 응용은 확장 연산이 이름이 일치할 때 기존 필드를 덮어쓰기를 원할 수 있고, 다른 응용은 둘 다 접근 가능하게 유지하기를 원할 수 있으며, 또 어떤 경우에는 경로 기반 주소 지정 방식을 원할 수도 있다.[10]
[편집]
행 다형적 레코드 타입은 각 필드와 그에 대응하는 타입의 목록, 누락된 필드의 목록, 그리고 임의의 추가 필드의 부재 또는 존재를 나타내는 변수를 정의한다. 두 목록은 모두 선택 사항이며, 변수에는 제약이 걸릴 수 있다. 구체적으로 이 변수는 “empty”일 수 있는데, 이는 그 레코드에 추가 필드가 존재할 수 없음을 뜻한다.
이는 와 같이 쓸 수 있다. 이는 각각
라는 필드를 가지며 그 타입이
인(단
) 레코드 타입을 나타내고, 또한
라는 필드는 가지지 않으며(단
), 한편
는 레코드가
이외의 다른 필드를 포함할 수 있음을 표현한다.
행 다형적 레코드 타입을 사용하면 레코드의 일부 구간에만 작용하는 프로그램을 작성할 수 있다. 예를 들어 두 개 이상의 좌표를 가진 레코드를 받아 동일한 타입을 반환하는 어떤 2차원 변환 함수를 정의할 수 있다.
행 다형성 덕분에 이 함수는 3차원(사실은 _n_차원) 점에 대해서도 2차원 변환을 수행할 수 있으며, z 좌표(또는 다른 어떤 좌표든)를 그대로 유지한다. 보다 일반적으로 말하면, 이 함수는 와
필드를 타입
와 함께 포함하는 어떤 레코드에도 작용할 수 있다. 정보 손실은 없다. 타입은 변수
로 표현되는 모든 필드가 반환 타입에도 존재함을 보장한다. 이와 대조적으로 타입 정의
는 그 타입의 레코드가 정확히
와
필드만 가지고 그 외에는 아무것도 없다는 사실을 표현한다. 이 경우에는 고전적인 레코드 타입이 얻어진다.
[편집]
필드 선택 , 필드 추가
, 필드 제거
와 같은 레코드 연산에는 행 다형적 타입을 부여할 수 있다.
행 다형성은 Standard ML에서는 지원되지 않지만, SML#[11]이나 Ocaml 같은 몇몇 확장판 또는 파생 언어에서는 지원된다.
SML#의 첫 번째 버전이 존재하게 된 직접적인 동기 중 하나는[12] 행 다형성의 추가였으며, 이는 Ohori 등[13]의 SIGMOD '89 논문에 기반한 것이었다. 이 논문은 SML에 대한 “Machiavelli” 확장을 도입했지만, 그 이름은 나중에 “SML# of Kansai”로 바뀌었고, 다시 더 짧은 이름으로 정착했다. 이름의 '#'는 F#와는 아무 관련이 없으며, 필드 접근에서 행 다형적 타입을 암묵적으로 정의하는 데 사용되는 # 연산자에서 유래한 것이다.
Ocaml에서는 행 다형성이 Ocaml의 object 타입과 다형적 변이체에 사용된다. 일반적인 레코드 타입은 Ocaml에서 행 다형적이지 않다.[14] Castagna 등은 Ocaml에 흐름 민감 타입 지정이 부족하다고 비판했는데, 이는 특히 다형적 변이체의 타입 추론에서 두드러진다. 또한 이들은 Ocaml에 진정한 비태그형 합집합 타입이 없기 때문에, 다형적 변이체에 대해 추론되는 일부 타입이 지나치게 제한적이라고 지적한다. 특히 곱 타입이 다형적 변이체와 함께 사용될 때 그러하다.[15]
F#는 “Statically Resolved Type Parameters”(SRTP) 메커니즘을 사용하여 행 다형성을 모사할 수 있으며, [16] 이는 비형식적으로 “정적 덕 타이핑”이라고도 불린다.[17] 그러나 이는 인라인 F# 함수에만 제한되므로, 그러한 함수들은 .NET 타입 시스템으로 내보내지지 않으며, .NET 자체도 이러한 기능을 지원하지 않는다.
행 다형성은 PureScript에서도 지원된다.[18]