Proper use of exit{Success,Failure}

Dear all, I'm writing a command line program which may need to exit early based on some condition. Because of the pipeline the program is a part of, I want to be able to control the exit status when it does terminate. I can successfully use 'error' to indicate failure, but also want to exit early with success (or any other status). Here's what I've managed:
import System.Exit (exitSuccess) import Control.Monad (when)
main = do
... code to reasonably initialize condition, e.g.:
let condition = True when condition (putStrLn "Bailing out.")>>exitSuccess>>(return ())
... program continues If I remove ">>(return ())" my code will not typecheck because "exitSuccess :: IO a". But this looks ugly and smells sufficiently like a kludge that I presume there is a better way to do it. Any suggestions appreciated, vale

Try `Control.Monad.void`. It is equivalent of adding `>> return ()` to the
end of a block.
void $ do
...
On 9 June 2015 at 20:55, Vale Cofer-Shabica
Dear all,
I'm writing a command line program which may need to exit early based on some condition. Because of the pipeline the program is a part of, I want to be able to control the exit status when it does terminate. I can successfully use 'error' to indicate failure, but also want to exit early with success (or any other status). Here's what I've managed:
import System.Exit (exitSuccess) import Control.Monad (when)
main = do
... code to reasonably initialize condition, e.g.:
let condition = True when condition (putStrLn "Bailing out.")>>exitSuccess>>(return ())
... program continues
If I remove ">>(return ())" my code will not typecheck because "exitSuccess :: IO a". But this looks ugly and smells sufficiently like a kludge that I presume there is a better way to do it.
Any suggestions appreciated, vale _______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
-- Regards Sumit Sahrawat

exitSuccess :: IO a means that exitSuccess type-checks for any `a`. Your program should typecheck without `void`. I suspect you've got a stray paren. This prints "Bailing out." and exits zero for me: module Main where import System.Exit (exitSuccess) import Control.Monad (when) main = do let condition = True when condition (putStrLn "Bailing out." >> exitSuccess) putStrLn "Continuing normally..." On Tue, 9 Jun 2015 at 08:27 Sumit Sahrawat, Maths & Computing, IIT (BHU) < sumit.sahrawat.apm13@iitbhu.ac.in> wrote:
Try `Control.Monad.void`. It is equivalent of adding `>> return ()` to the end of a block.
void $ do ...
On 9 June 2015 at 20:55, Vale Cofer-Shabica
wrote: Dear all,
I'm writing a command line program which may need to exit early based on some condition. Because of the pipeline the program is a part of, I want to be able to control the exit status when it does terminate. I can successfully use 'error' to indicate failure, but also want to exit early with success (or any other status). Here's what I've managed:
import System.Exit (exitSuccess) import Control.Monad (when)
main = do
... code to reasonably initialize condition, e.g.:
let condition = True when condition (putStrLn "Bailing out.")>>exitSuccess>>(return ())
... program continues
If I remove ">>(return ())" my code will not typecheck because "exitSuccess :: IO a". But this looks ugly and smells sufficiently like a kludge that I presume there is a better way to do it.
Any suggestions appreciated, vale _______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
-- Regards
Sumit Sahrawat _______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners

Thank you Alex, Sumit!
I did indeed have stray parentheses. I feel a bit silly for convincing
myself that something with my types was wrong when it was just an
error in grouping. Thanks for the clarification and the note about
void.
-vale
On Tue, Jun 9, 2015 at 11:38 AM, Alex Hammel
exitSuccess :: IO a means that exitSuccess type-checks for any `a`. Your program should typecheck without `void`. I suspect you've got a stray paren.
This prints "Bailing out." and exits zero for me:
module Main where
import System.Exit (exitSuccess) import Control.Monad (when)
main = do let condition = True when condition (putStrLn "Bailing out." >> exitSuccess) putStrLn "Continuing normally..."
On Tue, 9 Jun 2015 at 08:27 Sumit Sahrawat, Maths & Computing, IIT (BHU)
wrote: Try `Control.Monad.void`. It is equivalent of adding `>> return ()` to the end of a block.
void $ do ...
On 9 June 2015 at 20:55, Vale Cofer-Shabica
wrote: Dear all,
I'm writing a command line program which may need to exit early based on some condition. Because of the pipeline the program is a part of, I want to be able to control the exit status when it does terminate. I can successfully use 'error' to indicate failure, but also want to exit early with success (or any other status). Here's what I've managed:
import System.Exit (exitSuccess) import Control.Monad (when)
main = do
... code to reasonably initialize condition, e.g.:
let condition = True when condition (putStrLn "Bailing out.")>>exitSuccess>>(return ())
... program continues
If I remove ">>(return ())" my code will not typecheck because "exitSuccess :: IO a". But this looks ugly and smells sufficiently like a kludge that I presume there is a better way to do it.
Any suggestions appreciated, vale _______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
-- Regards
Sumit Sahrawat _______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
_______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
participants (3)
-
Alex Hammel
-
Sumit Sahrawat, Maths & Computing, IIT (BHU)
-
Vale Cofer-Shabica