교차로 유형

Intersection type

유형 이론에서는 {\(\ {\(\ 모두 할당 가능한 값에 교차 유형을 할당할 수 있습니다. 이 값은 교차 유형 시스템에서 [1]교차 유형 지정할 수 있습니다.일반적으로 두 유형의 값 범위가 겹치면 두 범위의 교차점에 속하는 값을 이 두 유형의 교차점 유형을 할당할 수 있습니다.이러한 값은 인수로서 2종류의 어느쪽인가를 필요로 하는 함수에 안전하게 전달할 수 있습니다.예를 들어 Java의 경우 클래스는Boolean양쪽을 실장합니다.Serializable및 그Comparable인터페이스입니다.따라서 타입의 오브젝트는Boolean형식 인수를 예상하는 함수에 안전하게 전달될 수 있습니다.Serializable유형 인수를 예상하는 함수에 대해 설명합니다.Comparable.

교차로 유형은 복합 데이터 유형입니다.제품 유형과 마찬가지로 개체에 여러 유형을 할당하는 데 사용됩니다.그러나 제품 유형은 튜플에 할당되므로 각 튜플 요소에 특정 제품 유형 구성 요소가 할당됩니다.이에 비해 교차로 유형의 기본 객체는 반드시 복합 객체일 필요는 없습니다.제한된 형태의 교차로 유형은 세분화 유형입니다.

교차로 유형은 오버로드[2]함수를 설명하는 데 유용합니다.예를 들어,number => number인수로서 번호를 받아 번호를 반환하는 함수의 유형입니다.string => string는 문자열을 인수로 사용하여 문자열을 반환하는 함수 유형입니다.이 두 유형의 교차점을 사용하여 주어진 입력 유형에 따라 어느 한쪽을 실행하는 함수를 설명할 수 있습니다(오버로드됨).

Ceilon, Flow, Java, Scala, TypeScriptWhiley(교차 유형과의 언어 비교 참조)를 포함한 현대의 프로그래밍 언어는 인터페이스 사양을 조합하고 애드혹 다형성을 표현하기 위해 교차 유형을 사용합니다.파라메트릭 다형성을 보완하기 위해 아래의 TypeScript 예시와 같이 교차로 우려에 의한 등급 계층 오염을 방지하고 보일러 플레이트 코드를 줄이기 위해 교차 유형을 사용할 수 있습니다.

교차 유형에 대한 유형 이론적 연구를 교차 유형 [3]분야라고 합니다.주목할 만한 것은 프로그램 종료를 [4]교차 유형을 사용하여 정밀하게 특성화할 수 있다는 점이다.

TypeScript 예시

TypeScript는 다음과 같이 교차 [5]유형을 지원하여 유형 시스템의 표현성을 향상시키고 잠재적인 클래스 계층 크기를 줄입니다.

다음 프로그램 코드는 클래스를 정의합니다.Chicken,Cow,그리고.RandomNumberGenerator각각 방법이 있다는 것produce두 가지 유형의 개체를 반환하는 경우Egg,Milk, 또는number또, 기능eatEgg그리고.drinkMilk형식상의 인수를 필요로 하다Egg그리고.Milk,각각 다음과 같다.

클래스 에그 {private kind: "Egg" } 클래스 우유 {private kind: "Milk" } //생성 에그 클래스 치킨 {products() {return new Eggg(); } //생성 우유 클래스 Cow {products} {products new Milk(); } returnew Milk() //생성 {productsom} returnumber Generator {production}.계란을 먹었다."; } //우유기능 drink Milk(우유: 우유) {반환 "우유를 마셨습니다."; }

다음 프로그램 코드는 애드혹 다형 함수를 정의합니다.animalToFood멤버 함수를 호출합니다.produce주어진 목적의animal.기능animalToFood에는 두 가지 유형의 주석이 있습니다.((_: Chicken) => Egg)그리고.((_: Cow) => Milk), 교차로 유형 생성자를 통해 연결됨&구체적으로는animalToFood타입의 인수에 적용하면Chicken유형 개체를 반환합니다.Egg타입의 인수에 적용할 경우,Cow유형 개체를 반환합니다.Milk.이상적으로.animalToFood(우연히) 를 가진 어떤 대상에도 적용할 수 없습니다.produce방법.

//닭을 주면 달걀을 낳고, 소를 주면 우유생산한다. 동물용 ToFood: (_: ) = > 달걀) & (_: ) = 기능(동물: 임의) {return animal.produce(); };

마지막으로, 다음 프로그램 코드는 위의 정의를 유형별로 안전하게 사용하는 것을 보여줍니다.

변화하다 치킨. = 신규 치킨.(); 변화하다 소. = 신규 소.(); 변화하다 난수 생성기 = 신규 랜덤 번호 생성기();  콘솔.로그.(치킨..생산하다()); //계란 { } 콘솔.로그.(소..생산하다()); //우유 { } 콘솔.로그.(난수 생성기.생산하다()); //0.2626353555444987  콘솔.로그.(애니멀 투 푸드(치킨.)); //Egg{} 콘솔.로그.(animalToFood(소.)); {}//Milk /(animalToFood(randomNumberGenerator). //ERROR:형식 'RandomNumberGenerator의 불일치 논증 형식 'Cow'의 매개 변수에 할당할 수 없다.  콘솔.로그.(eatEgg(animalToFood(치킨.))); //I 달걀을 먹었다. /(eatEgg(animalToFood(cow)));//ERROR:형식 'Milk의 불일치 논증 형식 'Egg'의 매개 변수에 할당할 수 없다. 콘솔.로그.(drinkMilk(animalToFood(소.))); //I이 우유를 좀 마셨어 /(drinkMilk(animalToFood(닭)));//ERROR:형식 'Egg의 불일치 논증 형식 'Milk'의 매개 변수에 할당할 수 없다. 

위의 프로그램 코드:다음 속성을 가진다.

  • Lines1–3 개체를 만드chicken,cow,그리고.randomNumberGenerator각자의 형의..
  • Lines 때를 호출하여 가져온 각각의 결과(의견만큼 제공되)은 이전에 만든 개체에 5–7 프린트이다.produce.
  • 9행(응답 10)은 이 방법의 안전한 사용을 보여준다.animalToFood에 적용되다chicken(응답).cow).
  • 줄 11은 코멘트가 없는 경우 컴파일 시 유형 오류가 발생합니다.실장에도 불구하고animalToFood를 호출할 수 있습니다.produce의 방법randomNumberGenerator, 의 유형 주석animalToFood거부합니다.이것은 의 의도된 의미에 따른 것이다.animalToFood.
  • 13행(응답 15)은 다음과 같은 적용 방법을 보여줍니다.animalToFood로.chicken(응답).cow)에 의해 오브젝트가 타입이 됩니다.Egg(응답).Milk).
  • 14행(응답 16)은 다음과 같은 적용 방법을 보여줍니다.animalToFood로.cow(응답).chicken)에서는 오브젝트가 타입이 되지 않습니다.Egg(응답).Milk따라서 코멘트가 없는 경우 14행(resp.16)은 컴파일 시 타입 에러가 발생합니다.

상속과의 비교

위의 미니멀리즘 예는 예를 들어 클래스를 도출함으로써 상속을 사용하여 실현될 수 있습니다.Chicken그리고.Cow하층 계급에서Animal그러나 큰 환경에서는 불리할 수 있습니다.새로운 클래스를 클래스 계층에 도입하는 것은, 예를 들면 외부 라이브러리를 사용하는 경우, 크로스 컷에 관한 염려나 전혀 불가능하다고는 할 수 없습니다.상기의 예는, 다음의 클래스로 확장할 수 있습니다.

  • 학급Horse를 가지지 않다produce방법
  • 학급Sheep가 있다produce메서드 리턴Wool;
  • 학급Pig가 있다produce한 번만 사용할 수 있는 메서드, 반환Meat.

여기에는 생산 방법을 사용할 수 있는지 여부, 생산 방법이 식품을 반환하는지 여부 및 생산 방법을 반복적으로 사용할 수 있는지 여부를 지정하는 추가 클래스(또는 인터페이스)가 필요할 수 있다.전반적으로, 이것은 계급 계층을 오염시킬 수 있습니다.

덕 타이핑과의 비교

위의 미니멀리즘 예는 이미 오리타입을 사용하는 것이 주어진 시나리오를 실현하는 데 적합하지 않다는 을 보여줍니다.수업 중에RandomNumberGenerator를 포함합니다.produce메서드, 오브젝트randomNumberGenerator유효한 논거가 되어서는 안 된다animalToFood위의 예는 예를 들어 새로운 필드를 도입함으로써 덕 타이핑을 사용하여 실현할 수 있습니다.argumentForAnimalToFood학급에Chicken그리고.Cow대응하는 타입의 오브젝트가 유효한 인수임을 나타내는animalToFood그러나 이는 각 클래스의 크기만 증가시키는 것이 아니다(특히 다음과 유사한 방법이 더 많이 도입됨).animalToFood)는 로컬 이외의 접근법이기도 합니다.animalToFood.

함수 오버로드와의 비교

위의 예는 예를 들어 2가지 방법을 구현함으로써 함수 오버로드를 사용하여 실현할 수 있습니다.animalToFood(animal: Chicken): Egg그리고.animalToFood(animal: Cow): Milk. TypeScript 에서는 이러한 솔루션은 제시된 예시와 거의 동일합니다.Java와 같은 다른 프로그래밍 언어에서는 오버로드된 메서드를 별도로 구현해야 합니다.이로 인해 코드 복제 또는 보일러 플레이트 코드가 발생할 수 있습니다.

방문자 패턴과의 비교

의 예는 방문자 패턴을 사용하여 실현할 수 있습니다.각 동물 분류가 동물 분류를 구현해야 할 것입니다.accept인터페이스를 구현하는 개체를 받아들이는 메서드AnimalVisitor(로컬 이외의 보일러 플레이트 코드 포함).함수animalToFood실현될 것이다visit실시 방법AnimalVisitor아쉽게도 입력 유형 간의 연결(Chicken또는Cow및 결과 유형( )Egg또는Milk)는 표현하기 어렵습니다.

제한 사항

한편, 교차 유형을 사용하여 클래스 계층에 새로운 클래스(또는 인터페이스)를 도입하지 않고 함수에 로컬로 다른 유형에 주석을 달 수 있습니다.한편, 이 방법에서는 가능한 모든 인수 유형과 결과 유형을 명시적으로 지정해야 합니다.함수의 동작을 통합 인터페이스, 파라메트릭 다형성 또는 덕타이핑으로 정확하게 지정할 수 있는 경우 교차 유형의 상세 특성은 좋지 않습니다.따라서 교차로 유형은 기존 규격 방법을 보완하는 것으로 간주해야 한다.

종속 교차로 유형

는 형식 τ{\displaystyle \tau}그 용어)특히{\displaystyle)}.[6], 만약 한학기 M{M\displaystyle}가 독립 교차로 형식을 가지고 있다.(x:σ)∩ τ{\displ 변수에 따라 달라질지도 모르는 의존하고 교차로 형식, ∩ τ{\displaystyle(x:\sigma)\cap \tau}(x:σ)표시, 미디어에 의존하는 형식입니다.ays \displaystyle은 유형"\ \ 모두 갖습니다x 모든 치환된 입니다. {\ } ( { M )

스칼라 예시

Scala는 유형 선언을 개체 멤버로 지원합니다.이를 통해 오브젝트 멤버의 유형을 경로 [8]의존형이라고 하는 다른 멤버의 값에 의존할 수 있습니다.예를 들어, 다음 프로그램 텍스트는 Scala 특성을 정의합니다.Witness싱글톤 패턴을 [9]실장하기 위해서 사용할 수 있습니다.

특성 위트니스 {   유형 T    가치: T {} } 

상기의 특징Witness멤버를 선언합니다.T을 유형으로 할당할 수 있습니다.또한valuetype 값을 할당할 수 있습니다.T다음 프로그램 텍스트는 개체를 정의합니다.booleanWitness상기 특성의 예로서Witness. 오브젝트booleanWitness유형을 정의합니다.T~하듯이Boolean그리고 가치value~하듯이true. 예를 들어, 실행.System.out.println(booleanWitness.value)인쇄하다true콘솔로 이동합니다.

물건 부울 위트니스 확장 위트니스 {   유형 T = 부울    가치 = 진실의 } 

: 、 \ \ \ { x } : \ \be the 。x ( \ \ { x )를 가지는 오브젝트의 타입(구체적으로는 레코드 타입)으로 합니다.위의 예에서는 오브젝트는 다음과 같습니다.booleanWitness종속 교차로 유형:T : 을 할당할수 있습니다.x . \ ( : \ \ { T} : \ { \ text} 이유는 다음과 같습니다오브젝트booleanWitness멤버를 가지고 있다T타입이 할당되어 있다.Boolean그 가치로.부터Boolean유형, 객체입니다.booleanWitness、 T : {\\) :\{ :\Type 또한 booleanWitness멤버를 가지고 있다value값이 할당되어 있다.true타입의Boolean의 가치가 있기 때문에booleanWitness.TBoolean오브젝트booleanWitness에는유형 값 가 있습니다전체적으로 오브젝트booleanWitness에는 교집합 타입: : :Witness가 있습니다.T 따라서 자기 참조를 의존관계로 제시하면 booleanWitness에는 종속 교차로 : : Type : : : : : . \ :\{ T} :\

또는 의존 레코드 타입을 [10]사용하여 위의 미니멀리즘 예를 설명할 수 있습니다.종속 교차로 유형과 비교하여 종속 기록 유형은 엄격히 더 전문화된 유형 이론 [6]개념을 구성합니다.

유형 패밀리의 교차점

유형 패밀리의 교차점x: \ \ _ : \ \ x { \ x라는 용어에 의존할 수 있습니다.특히M { x되어 있는 경우} \ \ display style a n N { }의N { displaystyle }에는 : { [ x : =됩니다. 개념은 암묵적 Pi [11]유형이라고도 불리며, 인수N(\ N 용어 수준에서 유지되지 않음을 관찰합니다.

교차로 유형과 언어 비교

언어 적극적으로 개발 패러다임 상황 특징들
C# 네, 그렇습니다[12]. 논의[13] 또한 범용 타입 파라미터에는 복수의 인터페이스를 구현하기 위해 (모노라이즈된) 타입 인수를 필요로 하는 제약조건을 설정할 수 있습니다.그 결과 범용 타입 파라미터로 나타나는 런타임타입은 리스트 되어 있는 모든 인터페이스의 교차 타입이 됩니다.
실론 네, 그렇습니다[14]. 서포트되고[15] 있다
  • 유형 미세화
  • 인터페이스 구성
  • 폭의 서브타이핑
F# 네, 그렇습니다[16]. 논의[17] ?
흐름 네, 그렇습니다[18]. 서포트되고[19] 있다
  • 유형 미세화
  • 인터페이스 구성
포사이스 아니요. 서포트되고[20] 있다
  • 함수형 교차로
  • 분포, 공존 및 반변 함수 유형 하위 유형
자바 네, 그렇습니다[21]. 서포트되고[22] 있다
  • 유형 미세화
  • 인터페이스 구성
  • 폭의 서브타이핑
PHP 네, 그렇습니다[23]. 서포트되고[24] 있다
  • 순수 교차로 유형만(연합 유형과 결합할 수 없음)
  • 유형 미세화
  • 인터페이스 구성
스칼라 네, 그렇습니다[25]. 서포트되고[26][27] 있다
  • 유형 미세화
  • 특성 구성
  • 폭의 서브타이핑
타입 스크립트 네, 그렇습니다[28]. 서포트되고[5] 있다
  • 임의형 교차로
  • 인터페이스 구성
  • 폭과 깊이의 서브타이핑
와일 네, 그렇습니다[29]. 서포트되고[30] 있다 ?

레퍼런스

  1. ^ Barendregt, Henk; Coppo, Mario; Dezani-Ciancaglini, Mariangiola (1983). "A filter lambda model and the completeness of type assignment". Journal of Symbolic Logic. 48 (4): 931–940. doi:10.2307/2273659. JSTOR 2273659.
  2. ^ Palsberg, Jens (2012). "Overloading is NP-Complete". Logic and Program Semantics. Lecture Notes in Computer Science. Vol. 7230. pp. 204–218. doi:10.1007/978-3-642-29485-3_13. ISBN 978-3-642-29484-6.
  3. ^ Henk Barendregt; Wil Dekkers; Richard Statman (20 June 2013). Lambda Calculus with Types. Cambridge University Press. pp. 1–. ISBN 978-0-521-76614-2.
  4. ^ Ghilezan, Silvia (1996). "Strong normalization and typability with intersection types". Notre Dame Journal of Formal Logic. 37 (1): 44–52. doi:10.1305/ndjfl/1040067315.
  5. ^ a b "Intersection Types in TypeScript". Retrieved 2019-08-01.
  6. ^ a b Kopylov, Alexei (2003). "Dependent intersection: A new way of defining records in type theory". 18th IEEE Symposium on Logic in Computer Science. LICS 2003. IEEE Computer Society. pp. 86–95. CiteSeerX 10.1.1.89.4223. doi:10.1109/LICS.2003.1210048.
  7. ^ "Type declarations in Scala". Retrieved 2019-08-15.
  8. ^ Amin, Nada; Grütter, Samuel; Odersky, Martin; Rompf, Tiark; Stucki, Sandro (2016). "The essence of dependent object types". A List of Successes That Can Change the World - Essays Dedicated to Philip Wadler on the Occasion of His 60th Birthday. Lecture Notes in Computer Science. Vol. 9600. Springer. pp. 249–272. doi:10.1007/978-3-319-30936-1_14.
  9. ^ "Singletons in the Scala shapeless library". Retrieved 2019-08-15.
  10. ^ Pollack, Robert (2000). "Dependently typed records for representing mathematical structure". Theorem Proving in Higher Order Logics, 13th International Conference. TPHOLs 2000. Springer. pp. 462–479. doi:10.1007/3-540-44659-1_29.
  11. ^ Stump, Aaron (2018). "From realizability to induction via dependent intersection". Annals of Pure and Applied Logic. 169 (7): 637–655. doi:10.1016/j.apal.2018.03.002.
  12. ^ "C# Guide". Retrieved 2019-08-08.
  13. ^ "Discussion: Union and Intersection types in C Sharp". Retrieved 2019-08-08.
  14. ^ "Eclipse Ceylon: Welcom to Ceylon". Retrieved 2019-08-08.
  15. ^ "Intersection Types in Ceylon". Retrieved 2019-08-08.
  16. ^ "F# Software Foundation". Retrieved 2019-08-08.
  17. ^ "Add Intersection Types to F Sharp". Retrieved 2019-08-08.
  18. ^ "Flow: A Static Type Checker for JavaScript". Retrieved 2019-08-08.
  19. ^ "Intersection Type Syntax in Flow". Retrieved 2019-08-08.
  20. ^ 레이놀즈, J. C.(1988)Forsythe 프로그래밍 언어의 예비 설계입니다.
  21. ^ "Java Software". Retrieved 2019-08-08.
  22. ^ "IntersectionType (Java SE 12 & JDK 12)". Retrieved 2019-08-01.
  23. ^ "php.net".
  24. ^ "PHP.Watch - PHP 8.1: Intersection Types".
  25. ^ "The Scala Programming Language". Retrieved 2019-08-08.
  26. ^ "Compound Types in Scala". Retrieved 2019-08-01.
  27. ^ "Intersection Types in Dotty". Retrieved 2019-08-01.
  28. ^ "TypeScript - JavaScript that scales". Retrieved 2019-08-01.
  29. ^ "Whiley: an Open Source Programming Language with Extended Static Checking". Retrieved 2019-08-01.
  30. ^ "Whiley language specification" (PDF). Retrieved 2019-08-01.