2016-04-23 7 views
0

私は以下のように "PositiveInteger"のような新しいタイプを定義しました。newtype:誰かが私の説明をしてくれますか?このコードの仕組みは?

newtype PositiveInteger = PositiveInteger Integer deriving Show 

fromPositiveInteger :: PositiveInteger -> Integer 
fromPositiveInteger (PositiveInteger i) = i 

toPositiveInteger :: Integer -> PositiveInteger 
toPositiveInteger x 
    | (x < 0) = error "Not applicable to negative numbers" 
    | otherwise = PositiveInteger x 

私は 'fromPositiveInteger(10)'という文を実行すると、次のエラーが発生します。それは絶対にうまいです。

*Main> fromPositiveInteger (10) 

<interactive>:7:22: 
    No instance for (Num PositiveInteger) arising from the literal ‘10’ 
    In the first argument of ‘fromPositiveInteger’, namely ‘(10)’ 
    In the expression: fromPositiveInteger (10) 
    In an equation for ‘it’: it = fromPositiveInteger (10) 

次のようにコードを更新したとします。ステートメント 'fromPositiveInteger 10'はエラーなしで動作します。これはどうしたらできますか? PositiveInteger以来

newtype PositiveInteger = PositiveInteger Integer deriving Show 

fromPositiveInteger :: PositiveInteger -> Integer 
fromPositiveInteger (PositiveInteger i) = i 

toPositiveInteger :: Integer -> PositiveInteger 
toPositiveInteger x 
    | (x < 0) = error "Not applicable to negative numbers" 
    | otherwise = PositiveInteger x 

instance Num PositiveInteger where 
    fromInteger   = toPositiveInteger 
    x + y    = toPositiveInteger (fromPositiveInteger x + fromPositiveInteger y) 
    x - y    = let r = fromPositiveInteger x - fromPositiveInteger y in 
          if r < 0 then error "Unnatural subtraction" 
            else toPositiveInteger r 
    x * y    = toPositiveInteger (fromPositiveInteger x * fromPositiveInteger y) 

*Main> fromPositiveInteger (PositiveInteger 10) 
10 
*Main> fromPositiveInteger 10 
10 

答えて

6

は現在のインスタンスである(その最も一般的なタイプNum a => aである)、それfromPositiveIntegerための有効な引数作り、タイプPositiveIntegerを持つことができNum10

関連する問題