我想创建一个新的整数类型,它被限制在一定范围内。我试过了:
data PitchClass = PC Int deriving (Ord, Eq, Show)
instance Bounded PitchClass where
minBound = PC 0
maxBound = PC 11
然而,我想要的是像
这样的东西会失败的东西PC 12
或
PC (-1)
尝试。
对于您希望在创建新类型的情况下放置约束的情况的一般方法,其中值构造函数不从模块导出,而是返回类型实例和执行约束检查的函数被导出?
答案 0 :(得分:16)
是的,不从模块中导出数据构造函数是可行的方法。
相反,您可以导出一个按照您的说法进行检查的函数。这通常称为smart constructor。
答案 1 :(得分:7)
对于总值的数量很小的情况的替代解决方案是简单地枚举可能的构造函数。
data PitchClass = A | Bb | B | C | Db | D | Eb | E | F | Gb | G | Ab
deriving (Eq, Ord, Bounded, Show, Read)
你可以从这里尝试六种不同的黑客,以各种方式使它更方便;例如,您可以派生Enum
来获取toEnum . fromEnum = id
(和toEnum (-1) = {- an exception -}
),或者您可以编写自定义Integral
实例来获取0 = A
(以及您的选择) -1
)的行为。