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

jye*_*yet 3 haskell

对于Int8,有界范围是

minBound :: Int8 -- -128
maxBound :: Int8 -- 127
Run Code Online (Sandbox Code Playgroud)

如果我将两个Int8整数相加

(127 :: Int8) + (10 :: Int8) --  -119
Run Code Online (Sandbox Code Playgroud)

为什么它不显示超出范围的错误?

如果创建数据类型并添加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
Run Code Online (Sandbox Code Playgroud)

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

chi*_*chi 5

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
Run Code Online (Sandbox Code Playgroud)

  • @jyet由于溢出:Int8从-128变为127。计算127 + 1时得到-128。基本上,将256次加/减至结果以适合该范围。在几乎所有编程语言中,任何固定边界整数类型都会发生这种情况。 (4认同)