Row Polymorphism과 Structural Typing의 차이점은 무엇입니까?

Sep 15 2020

내가 우연히 발견 한 정의는 동일한 아이디어를 표현하는 것 같습니다. 즉, 레코드 유형 간의 관계는 이름이 아닌 필드 (또는 속성)에 의해 결정됩니다. 그들의 Wikipedia 페이지도 동일한 아이디어를 나타내는 것 같습니다.

구조 타입 시스템 (또는 속성 기반 유형 시스템) 타입 호환성과 동등한 형식의 실제 구조 또는 정의되지은 이름 또는 선언 장소와 같은 다른 특성에 의해 결정되는 유형 시스템의 주요 클래스이다.

프로그래밍 언어 유형 이론에서 행 다형성 은 레코드 필드 유형에 대해 다형성 프로그램을 작성할 수있는 일종의 다형성입니다 (행이라고도하므로 행 다형성).

그들 사이에 차이점이 있습니까?

답변

2 DanDoel Sep 20 2020 at 07:03

구조적 유형 시스템은 반드시 레코드와 관련이있는 것은 아닙니다. 예를 들어, 다음과 같은 시스템을 가질 수 있습니다.

data Bool = False | True
data Two = Zero | One

둘 다 두 개의 nullary 생성자가있는 유형이기 때문에 실제로 동일한 유형입니다. 또한 형식이 구조에 의해 결정 되더라도 두 레코드는 다음과 같이 레코드에 대해 많이 알려줄 필요는 없습니다.

{s : S ; t : T}
{s : S ; t : T ; u : U}

동일한 구조가 아니므로이 두 유형에 대해 편리한 것이없는 구조적 유형을 가질 수 있습니다.

유사하게, 분리 된 행 다형성은 많은 것을 말해주지 않습니다. 단지 행을 수량화 할 수 있고 행으로 매개 변수화 된 레코드 유형과 함께 사용할 수 있다는 것입니다. 그러나 실제로 시스템의 기능을 지정하는 행으로 수행 할 수있는 작업에는 모든 종류의 변형이 있습니다.

일반적으로 구조적 레코드의 경우 사람들은 최소한 하위 유형을 원합니다. 위의 두 번째 레코드 유형이 첫 번째의 하위 유형이라고 말할 수 있으므로 전자를 예상하는 모든 것에 후자를 전달할 수 있습니다. 행 다형성을 사용하여이를 수행하는 일반적인 방법은 존재할 수있는 추가 필드를 대신 수량화하고 일종의 행 연결을 사용하는 것입니다.

따라서 좀 더 구체적인 질문은 부분 형과 수량 자의 차이점이 무엇인지입니다. 이에 대한 대답은 일반적으로 정량화 된 변수가 배타적으로 공변 적으로 또는 반 변적으로 발생하지 않는 한 subtyping이 정량화 된 유형을 표현할 수 없다는 것입니다. 따라서 다음과 같이 말할 수 있습니다.

(forall a. a -> T) ~= Top -> T
(forall a. T -> a) ~= T -> Bot

그러나와 같은 유형의 forall a. a -> a경우 a정보 손실없이 선택할 수있는 유형은 없습니다 .

이것은있는 시스템으로 확장 단지 기록 하위 유형의 대 (적절한) 행 다형성. 그러나 서브 타이핑 및 수량 화가있는 시스템이 있고 서브 타이핑이 수량화 된 유형에 적용될 수있는 경우 차이가 훨씬 더 미묘 할 수 있습니다. 그러나 수량 자와 하위 유형을 모두 갖는 것은 상당히 까다로울 수 있습니다 (행 다형성도 올바르게 이해하기 쉽지는 않습니다).