2011-02-10 5 views
2

그게 이건 멍청한 질문입니다 느낌이지만, 여기 간다 ... 다른 유형의 요소의 하위 집합 인 유형을 정의 할 수 있습니까? 다음은 간단한 예입니다.유형을 다른 유형의 하위 집합으로 제한하는 방법은 무엇입니까?

scala> class Even(i: Int) { 
    | assert(i % 2 == 0) 
    | } 
defined class Even 

scala> new Even(3) 
java.lang.AssertionError: assertion failed 

이것은 런타임 검사입니다. 컴파일 할 때 형식을 검사하도록 형식을 정의 할 수 있습니까? IE의 경우 입력 매개 변수 i은 항상 짝수일까요?

답변

7

스칼라가 아니더라도 Coq 및 Agda와 같은 언어로 값을 입력하면이 작업을 수행 할 수 있습니다.

정확한 유스 케이스에 따라 유형 시스템에서 피아노 숫자를 인코딩하는 방법이 있지만 도움이 될 수 있습니다.

또한 일부 봉인 추상 슈퍼 타입 (아마도 OddOrEven)과 주어진 정수에서 올바른 인스턴스를 반환하는 팩토리 메소드와 함께 모두 EvenOdd을 정의하려고 할 수 있습니다.

다른 가능성은 추출기로 Even을 정의하는 것입니다.

+0

C#은 컴파일 타임에 제한된 버전을 수행 할 수 있습니다. –

+0

Approprite 때'Odd'가되도록'Even.apply'를 정의 할 수 있습니다. 농담하는 중 ... – Raphael

관련 문제