对于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不同,那么如何为自定义数据类型创建一个有界的实例呢?
答案 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