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


20

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

Ta=X:{aX,f:X{T,F}}
Te
Te=X:{aX,f:X{T,F}}

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

엑스,(엑스)?엑스,(엑스).

내가 어딘가에 잘못인가?

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

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

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

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


1
보편성과 실존의 차이점은 무엇입니까?

수학적으로 말하면, 당신은 맞다 : 만약 forall x. P(x)다음 exists x. P(x). 유형 시스템을 검사 할 때 유형 시스템이이를 고려하는지 여부는 모르겠습니다. 흥미로운 질문은 +1입니다.

1
@deinan : 만약 P (X)는 어떤을 위해 보유하지 않는 X 확실히보다 ∀xP (X)를 보유하지 않습니다. 아마도 x 가 없을 때 , 즉 ∀x∈XP (x)X = x 이면 ∃x∈XP (x)를 의미하지 않습니다 .

1
... 그리고 그것들이 집합 표기법없이 다시 쓰여지면, ∀xx∈X⇒P (x)∃xx∈X & P (x)∃xx∈X⇒P (x)다르게 보일 것입니다 X가 아닌 x 로 사소하게 만족합니다 .

1
멋진 질문입니다. Haskell에서는 유형 (forall b. Show b => b)의 값을 a (forall b. b)를 취하는 함수에 전달할 수 있지만 그 반대의 경우는 기대할 수없는 대체 성을 암시합니다 서브 타이핑 관계. 물론 타입에 대해 이야기 할 때, 특히 시맨틱에 대한 공식적인 타입 대수를 염두에두고 있다면보고있는 타입 시스템을 언급해야합니다.

답변:


10

엑스:,(엑스)엑스:,(엑스)

(엑스:,(엑스))(엑스:,(엑스))이자형

=엑스.{:엑스,에프:엑스영형영형}에이에이(미디엄)미디엄:엑스미디엄1M2XA(M1)A(M2)Ta

Te=X.{a:X,f:Xbool}BTeN:Xπ1(B)=Nπ2(B)={a:N,f:Nbool}N

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

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


1
하스켈 (Haskell) forall은 암시 적 정량화의 원래 맥락에서 실제로 보편적 인 정량 자이며, 최상위 정의를 위해 "외부에서"다형성 유형을 명시 적으로 보여줍니다. 이러한 정의의 "내부"에서 인수를 조작 할 때 다형성 유형이 효과적으로 존재합니다. 각 유형 변수는 특정 유형에 바인딩되어 있지만 해당 유형이 무엇인지 알 수 없습니다. 필자가 아는 한 Haskell 구현은 진정한 (원시의 최상위) 실존 유형을 지원하지 않으며 어떤 목적을 달성 해야하는지 명확하지 않습니다.
CA McCann

1
GHC가 지원하는 실존 유형은 "외부"에서 볼 때 반 변형 적 위치에서 발생하는 보편적 인 정량자를 갖는 (직접 또는 간접적으로) 유형입니다. 이것은 논리적 부정과 거의 동일한 이원성을 사용하므로 최상위 수준에서 이러한 실재 유형을 가지려면 CPS와 같은 인코딩을 사용하여 이중적으로 반 변형이어야합니다 (Uday Reddy가 제공하는 동등성입니다). 직관적으로 존재하는 정량자는 비슷한 이유로 비슷한 불편 함을 나타냅니다.
CA McCann

5

X.P(X)X.P(X)

X.(X×(XBool))XX.(X×(XBool))

 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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.