【问题标题】:How to create a type bounded within a certain range如何创建在一定范围内有界的类型
【发布时间】:2011-11-10 06:59:16
【问题描述】:

我想创建一个新的整数类型,它限制在某个范围内。我试过了:

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

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

但是,我想要的是一些会失败的东西,如果像这样

PC 12

PC (-1)

已尝试。

在您希望对创建新类型施加约束的情况下,这是一种通用方法,其中值构造函数不是从模块中导出,而是导出返回类型实例并执行约束检查的函数?

【问题讨论】:

    标签: haskell types typeclass


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-24
        • 1970-01-01
        • 2019-03-29
        • 2016-01-23
        • 1970-01-01
        • 2017-07-22
        • 1970-01-01
        相关资源
        最近更新 更多