简体   繁体   中英

newtype: Can someone explain me, how this code works?

I defined new type like "PositiveInteger" like below.

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

When i execute the statement 'fromPositiveInteger (10)', i am getting following error. Which is absolutely fine.

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

Suppose, if i updated my code like below. the statement 'fromPositiveInteger 10' works without any error. How can this happened?

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

由于PositiveInteger现在是Num的实例,因此10 (其最通用的类​​型是Num a => a )可以具有类型PositiveInteger ,使其成为fromPositiveInteger的有效参数。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM