초기 메모 :
이 질문은 내가 원하는 것을 정확하게 진술하는 적절한 용어가 없기 때문에 여러 번 편집 한 후에 닫혔습니다. 그런 다음 Sam Tobin-Hochstadt는 함수 반환 값에 대한 교차 유형을 지원하는 프로그래밍 언어를 정확히 인식 할 수있는 의견을 게시했습니다.
이제 질문이 다시 열리기 때문에 (정확하게) 더 정확한 방식으로 다시 작성하여 질문을 개선하기로 결정했습니다. 따라서 아래의 일부 답변과 의견은 이전 수정 사항을 참조하므로 더 이상 의미가 없을 수 있습니다. (이 경우 질문의 편집 기록을 참조하십시오.)
함수 반환 값에 대한 교차 유형 을 지원하는 널리 사용되는 정적 및 강력한 형식의 프로그래밍 언어 (예 : Haskell, 일반 Java, C #, F # 등)가 있습니까? 그렇다면, 어떻게, 어떻게?
(정직하다면 누군가가 C # 또는 Java와 같은 주류 언어로 교차 유형을 표현하는 방법을 보여주고 싶습니다.)
C #과 유사한 의사 코드를 사용하여 교차 유형이 어떻게 보일지에 대한 간단한 예를 제공합니다.
interface IX { … }
interface IY { … }
interface IB { … }
class A : IX, IY { … }
class B : IX, IY, IB { … }
T fn() where T : IX, IY
{
return … ? new A()
: new B();
}
즉, 기능은 fn
어떤 유형의 인스턴스를 반환 T
호출자가이 인터페이스를 구현하는 것으로 만 알고있는, IX
과 IY
. (즉, 제네릭과 달리 호출자는 구체적인 유형을 선택 T
하지 못합니다. 함수는 T
실제로 이것을 범용 유형이 아니라 실존 유형 이라고 가정합니다 .)
추신 : 나는 단순히 a를 정의하고 interface IXY : IX, IY
의 반환 유형을 fn
로 변경할 수 있음을 알고 있습니다 IXY
. 그러나 추가 인터페이스 IXY
를 이전에 정의 된 유형 A
으로 만 구현 IX
하고 IY
별도로 구현할 수없는 경우가 종종 있기 때문에 이는 실제로 동일하지 않습니다 .
각주 : 교차로 유형에 대한 일부 리소스 :
"유형 시스템"에 대한 Wikipedia 기사 에는 교차 유형에 대한 하위 섹션이 있습니다 .
Benjamin C. Pierce (1991), "교차 유형, 조합 유형 및 다형성 프로그래밍"
David P. Cunningham (2005), "실제로 교차로 유형" .이 문서에는 Wikipedia 기사에 언급 된 Forsythe 언어에 대한 사례 연구가 포함되어 있습니다.
스택 오버플로 질문, "연합 유형과 교차 유형" 그 중 몇 가지 좋은 답변을 가지고 이 하나 위의 광산과 유사한 교차로 유형의 의사 코드 예제를 제공합니다.
T
가 인터페이스의 I
모든 메소드를 구현할 때 인터페이스로 취급 할 수 있지만 해당 인터페이스를 선언하지 않은 경우"로 변경됩니다.
T
그것은 단지 "/ 구현 확장 몇 가지 유형으로 함수 선언에서 정의되어 있더라도 유형을 정의IX
및IY
". 사실 실제 반환 값은 그 특별한 경우이다 (A
또는B
각각)는 단지뿐만 아니라 사용하여 해당를 얻을 수있는, 여기 아무것도 특별하지 않다Object
대신T
.