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.