範囲制限付きの数値型を作成するにはどうすればどうすればいいですか？


Haskellにて範囲を制限してくれるようなIntのような型を作ってみたいのですが、  
以下のようにBounded型クラスのインスタンスにしても制限されません。  
どうすれば範囲制限付きのIntのような型を作成できますか？

[code]

    {-# LANGUAGE GeneralizedNewtypeDeriving #-}
    
    newtype Century = Century Int
       deriving (Num,Eq,Ord,Show)
    
    instance Bounded Century where
        minBound = 0
        maxBound = 100
    
[/code]




[`Num`クラスの`fromInteger`メソッドを自前で書くこと](https://www.haskell.org/tutorial/numbers.html)で、
数値リテラルを使うことが出来ます。（ベースはHidekiさんの回答と同様です）

[code]

    {-# LANGUAGE GeneralizedNewtypeDeriving #-}
    
    module Century (Century, makeCentury) where
    
    newtype Century = Century Int
        deriving (Eq,Ord,Show)
    
    makeCentury :: Int -> Century
    makeCentury n
        | n < 0 || n > 100 = error "Out of range"
        | otherwise        = Century n
    
    instance Num Century where
      Century a + Century b = makeCentury $ a + b
      Century a * Century b = makeCentury $ a * b
      abs (Century a) = makeCentury $ abs a
      signum (Century a) = makeCentury $ signum a
      fromInteger = makeCentury . fromIntegral
      negate (Century a) = makeCentury $ negate a
    
[/code]

[code]

    *Century> 1 :: Century
    Century 1
    *Century> 100 :: Century
    Century 100
    *Century> 10 * 100 :: Century
    Century *** Exception: Out of range
    
[/code]

但し、このコードだとラップアラウンドを警告してくれない点に注意してください。

