범용 유형은 실존 유형의 하위 유형 또는 특수한 경우입니까?

보편적으로 정량화 된 유형 : 가 하위 유형인지 또는 동일한 시그니처 를 갖는 존재 적으로 정량화 된 타입 의 특별한 경우 :T a = X : { a X , f : X { T , F } }

Ta

Ta=∀X:{a∈X,f:X→{T,F}}

Te

Te=∃X:{a∈X,f:X→{T,F}}

“yes”라고 말하고 싶습니다. “모든 X”( )에 해당하는 것이 있으면 “일부 X”( ) 에도 해당되어야합니다 . 즉, ‘ ‘이 있는 명령문 은 단순히 ‘ ‘ 있는 동일한 명령문의보다 제한된 버전입니다 .

∀X

∃X

∀엑스,피(엑스)⟹?∃엑스,피(엑스).

내가 어딘가에 잘못인가?

배경 : 왜 이런 질문을합니까?

“추상 [데이터] 유형에 존재하는 유형”이있는 이유와 방법을 이해하기 위해 존재 유형을 연구하고 있습니다 . 이론만으로는이 개념을 잘 이해할 수 없습니다. 구체적인 예도 필요합니다.

불행히도, 대부분의 프로그래밍 언어는 실존 유형에 대한 지원이 제한되어 있기 때문에 좋은 코드 예제를 찾기가 어렵습니다. (예를 들어, Haskellforall 또는 Java ?와일드 카드 ) 보편적으로 정량화 된 유형은 “일반”을 통해 많은 최신 언어에서 지원됩니다.

더 나쁜 것은 제네릭이 존재 유형과 쉽게 혼합되어 존재 유형 을 보편적 유형과 구분하기가 더 어려워지는 것 같습니다 . 이 믹스 업이 왜 그렇게 쉬운 지 궁금합니다. 이 질문에 대한 대답은 다음과 같이 설명 할 수 있습니다. 범용 유형이 실제로 존재하는 유형의 특수한 경우 인 경우, Java 유형과 같은 일반 유형이 List<T>어떤 방식 으로든 해석 될 수 있다는 것은 놀라운 일이 아닙니다.



답변

∀엑스:티,피(엑스)

∃엑스:티,피(엑스)

(∀엑스:티,피(엑스))⇒(∃엑스:티,피(엑스))

티ㅏ

티이자형

티ㅏ=∀엑스.{ㅏ:엑스,에프:엑스→비영형영형엘}

에이

에이(미디엄)

미디엄:엑스

미디엄1

M2

X

A(M1)

A(M2)

Ta

Te=∃X.{a:X,f:X→bool}

B

Te

N:X

π1(B)=N

π2(B)={a:N,f:N→bool}

N

forall이름에도 불구하고 Haskell ‘s에 의해 오도되지 마십시오 : 그것은 존재 정량화의 한 형태입니다.

배경은 Types와 Programming Languages를 강력히 권장합니다 (23 장과 24 장에서는 각각 범용 유형과 실존 유형에 대해 설명합니다). 연구 기사를 이해하는 데 유용한 배경을 제공합니다.


답변

∀X.P(X)

∃X.P(X)

∀X.(X×(X→Bool))

X

∃X.(X×(X→Bool))
 f (p: \forall X. (X * (X -> Bool))) = PACK X = Bool WITH p[Bool]

실존 유형에 대해 언급 한 기사는 약간 이론적입니다. 더 많은 튜토리얼 기사는 Cardelli and Wegner의 논문입니다 : 유형, 데이터 추상화 및 다형성에 대한 이해 . 프로그래밍 언어에 관한 대부분의 고급 교과서는 실존 유형에 대해 논의 할 것입니다. 좋은 책은 Mitchell의 Foundations of Programming Languages 입니다.

대부분의 프로그래밍 언어에는 명시 적으로 존재 유형이없는 것이 맞습니다. 그러나 많은 사람들이 추상 유형 (또는 “패키지”또는 “모듈”과 같은 다른 이름)을 가지고 있습니다. 따라서 그들은 실재 유형의 가치 를 표현할 수 있지만, 그러한 가치를 일류 엔티티로 취급하지는 않습니다.

∃X.P(X)

∀Y.(∀X.P(X)→Y)→Y