2016-04-23 83 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'沒有任何錯誤。這怎麼發生的?

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

由於PositiveInteger是現在的一個實例Num10(其最普遍的類型是Num a => a)可以有型PositiveInteger,使其成爲fromPositiveInteger有效參數。

相關問題