如何创建一定范围内的类型

use*_*344 18 haskell types typeclass

我想创建一个新的积分类型,它被限制在一定范围内.我试过了:

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

instance Bounded PitchClass where
  minBound = PC 0
  maxBound = PC 11
Run Code Online (Sandbox Code Playgroud)

然而,我想要的是如果有的话会失败

PC 12
Run Code Online (Sandbox Code Playgroud)

要么

PC (-1)
Run Code Online (Sandbox Code Playgroud)

被尝试了.

对于您希望在创建新类型的情况下放置约束的情况的一般方法,其中值构造函数不从模块导出,而是返回类型实例和执行约束检查的函数被导出?

ham*_*mar 19

是的,不是从模块中导出数据构造函数是要走的路.

相反,您导出一个按照您的说法进行检查的函数.这通常被称为智能构造函数.


Dan*_*ner 8

对于总值的数量很小的情况的替代解决方案是简单地枚举可能的构造函数.

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

你可以从这里尝试六种不同的黑客,以各种方式使它更方便; 例如,您可以派生Enum到get toEnum . fromEnum = id(和toEnum (-1) = {- an exception -}),或者您可以编写一个自定义Integral实例来获取0 = A(以及您选择的行为-1).