2011-09-04 4 views
15

특정 범위에 바인딩 된 새로운 정수 형식을 만들고 싶습니다. 나는 시도했다 :특정 범위 내에서 제한된 형식을 만드는 방법

data PitchClass = PC Int deriving (Ord, Eq, Show) 

instance Bounded PitchClass where 
    minBound = PC 0 
    maxBound = PC 11 

그러나, 내가 원하는 것을

PC 12 

처럼 또는

PC (-1) 

을 시도하면 실패합니다 무언가이다.

값 생성자가 모듈에서 내보내지지 않고 대신 형식의 인스턴스를 반환하고 제약 조건 검사를 수행하는 새 형식을 만드는 데 제약 조건을 적용하려는 일반적인 방법이 있습니까? 내 보낸거야?

답변

14

예, 모듈에서 데이터 생성자를 내보내는 것이 좋습니다.

대신에 말한 것처럼 검사를 수행하는 함수를 내 보냅니다. 이를 종종 smart constructor라고합니다.

5

전체 값의 수가 작은 경우에 대한 대체 솔루션은 가능한 생성자를 간단히 나열하는 것입니다.

data PitchClass = A | Bb | B | C | Db | D | Eb | E | F | Gb | G | Ab 
    deriving (Eq, Ord, Bounded, Show, Read) 

다양한 방법으로 더욱 편리하게 사용할 수 있도록 여기에서 시도 할 수있는 여러 가지 해킹이 있습니다. 예를 들어, 을 가져와 toEnum . fromEnum = id (및 toEnum (-1) = {- an exception -})을 얻거나 사용자 정의 Integral 인스턴스를 작성하여 0 = A (그리고 -1에 대한 동작 선택)을 얻을 수 있습니다.

관련 문제