2016-04-23 6 views
0

Ich habe einen neuen Typ wie "PositiveInteger" wie unten definiert.newtype: Kann mir jemand erklären, wie dieser Code funktioniert?

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 

Wenn ich die Aussage 'fromPositiveInteger (10)' ausführen, erhalte ich folgende Fehlermeldung. Was absolut in Ordnung ist.

*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) 

Angenommen, ich habe meinen Code wie folgt aktualisiert. Die Anweisung 'fromPositiveInteger 10' funktioniert ohne Fehler. Wie kann das passieren?

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 

Antwort

6

Seit PositiveInteger ist jetzt eine Instanz von Num, 10 (deren allgemeinste Art ist Num a => a) können die Art haben PositiveInteger es ein gültiges Argument für fromPositiveInteger machen.

Verwandte Themen