It is one of
the most useful functions to report errors, error function takes a string
message and display the message to the console.
Following is
the signature of error function.
error :: [Char]
-> a
As you observe,
it has return type of a, so we can call this from any function, it always has
right type. When you call error function from your code, it immediately aborts
the execution and prints the error message.
errorUtil.hs
divide x 0 = error "You can't divide a number by 0" divide x y = x / y
When you call the divide method by
passing second argument 0, it throws an Exception immediately.
*Main> :load errorUtil.hs [1 of 1] Compiling Main ( errorUtil.hs, interpreted ) Ok, modules loaded: Main. *Main> *Main> divide 10 0 *** Exception: You can't divide a number by 0 *Main>
We can rewrite
above program using Maybe data type like below.
errorUtil.hs
divide x 0 = Nothing divide x y = Just (x / y)
*Main> :load errorUtil.hs [1 of 1] Compiling Main ( errorUtil.hs, interpreted ) Ok, modules loaded: Main. *Main> *Main> divide 10 0 Nothing *Main> *Main> divide 10 123456 Just 8.100051840331778e-5 *Main>
Whenever you want to throw an error, try
to use Maybe.
Another
example
Suppose, you car going to implement
factorial function, usually factorial os not applicable for -ve numbers, so
when user call factorial function with –ve numbers, your function should throw
an error.
Sample.hs
factorial :: Int -> Int factorial num | (num == 0) = 1 | (num > 0) = num * factorial(num-1) | otherwise = error "factorial is only defined for +ve integers"
Prelude> :load Sample.hs [1 of 1] Compiling Main ( Sample.hs, interpreted ) Ok, modules loaded: Main. *Main> *Main> factorial 0 1 *Main> factorial 5 120 *Main> factorial (-9) *** Exception: factorial is only defined for +ve integers
No comments:
Post a Comment