有界类型类如何适用于自定义数据类型?

时间:2017-03-03 08:21:51

标签: haskell

对于Int8,有界范围是

minBound :: Int8 -- -128
maxBound :: Int8 -- 127

如果我添加两个Int8整数

(127 :: Int8) + (10 :: Int8) --  -119

为什么它不会显示出错误的错误?

如果我创建数据类型并添加Bounded:

的实例
newtype Boost = Boost Int
    deriving (Eq, Show)

instance Num Boost where
    (Boost a) + (Boost b) = Boost (a+b)

instance Bounded Boost where
    minBound = Boost 1
    maxBound = Boost 10

(Boost 10) + (Boost 12) -- Boost 22

显然它的行为与Int8不同,那么如何为自定义数据类型创建一个有界的实例呢?

1 个答案:

答案 0 :(得分:3)

Bounded不会影响算术运算,它只提供两个常量minBound, maxBound。编写Bounded实例的人应该在那里定义可以在类型内表示的值的边界。

如果您想限制带有错误的算术,请定义您自己的Num实例。

instance Num Boost where
   (Boost a) + (Boost b) | 0 <= a+b && a+b < 8 = Boost (a+b)
                         | otherwise = error "out of range"
   -- other operations here