Copyright | Copyright (C) 2023 Yoo Chung |
---|---|
License | GPL-3.0-or-later |
Maintainer | dev@chungyc.org |
Safe Haskell | Safe-Inferred |
Language | GHC2021 |
Part of Ninety-Nine Haskell Problems. Some solutions are in Solutions.P75.
Documentation
maybeGoldbach :: String -> Maybe (Integer, (Integer, Integer)) Source #
In Problems.P75, askGoldbach
could not output an error if the input was not a number
or it was not an even number greater than 2. We could implement a function which returned Nothing
when the input is not valid, such as in the following.
maybeGoldbach :: String -> Maybe (Int, (Int,Int)) maybeGoldbach s = case readMaybe s of Nothing -> Nothing Just n -> if n < 2 then Nothing else if odd n then Nothing else Just (n, goldbach n)
Then we could take advantage of this function to print out an error if the input is not valid.
>>>
:{
let format (n, (a,b)) = (show n) ++ "=" ++ (show a) ++ "+" ++ (show b) maybeAskGoldbach hIn hOut = do s <- hGetLine hIn case maybeGoldbach s of Nothing -> hPutStrLn hOut "error" Just x -> hPutStrLn hOut $ format x in do withFixedInput "104" stdout maybeAskGoldbach withFixedInput "not a number" stdout maybeAskGoldbach :} 104=3+101 error
However, the implementation of maybeGoldbach
above is a chain of conditional expressions.
It is not problematic in this particular case, but can make things awkward when there
are many conditions and successful operations that need to happen
for a function to return a Maybe
value.
Take advantage of the fact that Maybe
is a monad
and rewrite maybeGoldbach
more succintly using do notation.
The guard
function, which in the Maybe
monad
returns Just ()
when its argument is true
and Nothing
when its argument is false,
would be useful for making it even more succinct.
Examples
>>>
maybeGoldbach "104"
Just (104,(3,101))
>>>
maybeGoldbach "not a number"
Nothing
>>>
maybeGoldbach "1"
Nothing
>>>
maybeGoldbach "101"
Nothing
Original function
The function below is the equivalent implementation of maybeGoldbach
without do notation.
maybeGoldbach' :: String -> Maybe (Integer, (Integer, Integer)) Source #
Parses a string into a number and returns a tuple of the number and its Goldbach pair.
Returns Nothing
if the input is not valid.
This is an implementation of maybeGoldbach
without do notation.
Examples
>>>
maybeGoldbach' "104"
Just (104,(3,101))
>>>
maybeGoldbach' "not a number"
Nothing
>>>
maybeGoldbach' "1"
Nothing
>>>
maybeGoldbach' "101"
Nothing