2011-09-04 15 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の動作を選択してください)というインスタンスを作成することができます。