Haskell 如何创建限定在特定范围内的类型

Haskell 如何创建限定在特定范围内的类型,haskell,types,typeclass,Haskell,Types,Typeclass,我想创建一个新的积分类型,它有一定的范围。我试过: data PitchClass = PC Int deriving (Ord, Eq, Show) instance Bounded PitchClass where minBound = PC 0 maxBound = PC 11 然而,我想要的是,如果像这样的事情发生,就会失败 PC 12 或 尝试 对于希望在创建新类型时设置约束的情况,通常的方法是不从模块导出值构造函数,而是导出返回类型实例并执行约束检查的函数吗?是,不从模

我想创建一个新的积分类型,它有一定的范围。我试过:

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

instance Bounded PitchClass where
  minBound = PC 0
  maxBound = PC 11
然而,我想要的是,如果像这样的事情发生,就会失败

PC 12

尝试


对于希望在创建新类型时设置约束的情况,通常的方法是不从模块导出值构造函数,而是导出返回类型实例并执行约束检查的函数吗?

是,不从模块导出数据构造函数是一种方法


相反,您导出一个函数,该函数按照您所说的进行检查。这通常被称为。

对于总值如此之少的情况,另一种解决方案是简单地枚举可能的构造函数

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
的行为选择)

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