타입에 대해 산술을 설정할 수있는 프로그래밍 언어가 있습니까?


9

호기심에서 새로운 유형을 만들기 위해 유형에 산술을 설정할 수있는 언어가 있습니까? 다음과 같은 것 :

interface A {
  void a();
  void b();
}

interface B {
  void b();
  void c();
}

interface C = A & B; // has b()
interface D = A | B; // has a(), b() and c()
interface E = (A & B) ^ B; // has c()

일부 언어에서는 이러한 아이디어가 표현 될 수 있다는 것을 알고 있습니다 (즉, Java는 List<Comparable & Serializable>인터페이스 통합을 위해 가지고 있음 ). 유형 산술을 지원하는 언어에 대해서는 들어 본 적이 없습니다. 감사!


7
그러한 메커니즘은 어떻게 유용합니까?
Robert Harvey

4
내가 많이 본 패턴은 두 개의 다른 인터페이스를 확장하고 아무것도 추가하지 않는 인터페이스입니다 (예 CanWriteAndCompare extends Serializable, Comparable {}:). 이것을 일반화하는 방법을 생각하고있었습니다.
Haldean Brown

2
또한 오늘 똑같이 보이는 두 가지 구현으로 Aa 또는 a를 취할 수있는 메소드가있는 경우가 발생했습니다 B. 이 방법에서는 a A또는 a를 취할 수있는 다형성 메소드를 호출 B하므로 구현은 동일하지만 두 가지 유형을 취해야하므로 두 가지 구현이 필요합니다. 내가 할 수 있다면 더 쉬울 것이다 myMethod(A | B aOrB).
Haldean Brown


1
Or다중 상속으로 작업을 에뮬레이션 할 수 있습니다.
사용자

답변:


4

탄젠트 ( 0.3 spec )는 이와 비슷한 것을 사용합니다. (면책 조항 : 이것은 내 자신의 작은 연구 프로젝트입니다)

with실용주의가 그것을 정식으로 만들지 않았지만 현재 는 연합 연산자 모델링 상속으로 작동합니다. 일단 메소드에 구현을 도입하면 동일한 이름을 가진 엄격한 메소드 조합은 종종 원하는 것이 아니며 어쨌든 올바르게 수행하는 것이 불가능합니다.

intersectfoo(T,T)매개 변수가 다른 곳에서 모델 유형 유추가 지원됩니다 .

보완은 흥미롭지 만 부분적으로 유용하지 않았고 올바르게 포함하는 데 어려움이있는 부분 유형으로 이어졌습니다.

나는 비슷한 것을 가진 다른 연구 언어가 있지만 지금은 그것들을 기억할 수 없다는 것을 알고 있습니다. 주요 문제는 구조적 타이핑이 없으면 실제로 유용하지 않다는 것입니다. 다른 하나는 생성 된 유형을 저장하기 위해 일종의 유형 (유형 유형)이 필요하다는 것입니다. 그리고 그것은 구조적 타이핑보다 훨씬 덜 일반적입니다.

그것은 편향되어 있고 많지는 않지만 거기에 있습니다.


5

예, Ceylon은 Ceylon 둘러보기에서이 장에 설명 된대로 임시 조합 및 교차로 유형의 언어입니다.

http://ceylon-lang.org/documentation/1.0/tour/types/

당신이 이것에서 나오는 멋진 관용구의 수는 놀랍습니다. 여기 내가 최근 블로그에 하나의 흥미로운 예 . 여기 몇 가지 간단한 관용구를 빠르게 설명 하는 간단한 프레젠테이션이 있습니다.

더 좋은 점은 공용체 / 교차 형식은 하위 형식과 매개 변수 다형성을 결합하는 다른 언어와 달리 실론에서 일반 형식 인수 유추를 실제로 작동 시키는 "누락 된 링크"입니다 .

설명했듯이 이런 종류의 "타입 산술"에는 제한이 있습니다. 예를 들어 최소한 결정 불가능 성을 도입하지 않으면 형식 수준에 보완 연산자를 설정할 수 없습니다.

HTH


3

Scala는 부분적으로 (교집합이지만 노조가 아닌) 지원하고, 구조적 서브 타이핑 (OCaml이 예시라고 생각) 또는 (Haskell은 고전적인 언어) 에뮬레이션 할 수있을만큼 강력한 유형 시스템을 사용하여 모든 "세트 유형"을 갖습니다. "적어도 그러한 종류의 시스템을 받아들이는 유형 시스템의 단편 내 기능 (일명 HList / OOHaskell을 에뮬레이트 할 때 관련됨).

OCaml을 잘 모르므로 Scala에서 작동하는 예제의 일부를 알려 드리겠습니다.

trait A {
  def a(): Unit
  def b(): Unit
}

abstract class B { // just to prove it works with both traits and classes
  def b(): Unit
  def c(): Unit
}

type C = A with B
type D = { def b(): Unit } // not an exact translation, because unions aren't directly available
// type `E` is unrepresentable

Haskell의 버전은 사용중인 레코드 시스템에 따라 다르며 기본적으로 지원되지 않고 에뮬레이트되기 때문에 다소 어색 할 수 있습니다.

내가 아는 한 실론은 언어에 교집합 공용체 유형 이 모두 내장되어 있으므로 유형 수준의 "xor"를 해당 유형으로 인코딩 할 수 있습니다.


1

Java는 일부 컨텍스트에서 인터페이스 유형의 교차를 지원하지만 교차 유형의 변수를 작성할 수있는 한은 아닙니다. 예를 들어 ? :작업자를 사용할 때 교차로 유형이 작동 할 수 있습니다 . 해당 연산자의 두 번째 및 세 번째 피연산자가 겹치는 인터페이스 세트에서 상속되는 관련없는 인터페이스 인 경우 연산자 결과는 두 인터페이스에 공통 인 인터페이스 세트가됩니다.


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