Is this possible at all?
I don't think so, in the form that you suggest.
Ultimately, it all comes down to function applications, for which there is no such "bail out". Rather, I think something like this is required:
do
{ ...
; if cond then return 1
else do
(the rest)
}Here's an example from some real (tested) code:
[[
-- Open and read file, returning its handle and content, or Nothing
-- WARNING: the handle must not be closed until input is fully evaluated
repOpenFile :: String -> RepStateIO (Maybe (Handle,String))
repOpenFile fnam =
do { (hnd,hop) <- lift $
if null fnam then
return (stdin,True)
else
do { o <- try (openFile fnam ReadMode)
; case o of
Left e -> return (stdin,False)
Right h -> return (h,True)
}
; hrd <- lift $ hIsReadable hnd
; res <- if hop && hrd then
do {
; fc <- lift $ hGetContents hnd
; return $ Just (hnd,fc)
}
else
do { lift $ hClose hnd
; repError ("Cannot read file: "++fnam) 3
; return Nothing
}
; return res
}
]]#g --
Hi, While writing monad programs, I sometimes want to do a return as it is in imperative program. i.e., do{return 1; return 2} is same as return 1
This seems useful to me when I need to do something like do mwhen cond $ return 1 ...... -- subsequent actions
I know I can do if cond then return 1 else ( ...--subsequent actions )
However, that syntax does not look very pleasant to me due to this extra indentation and the pair of parens.
Is this possible at all?
Ben.
_______________________________________________ Haskell mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell
------------ Graham Klyne For email: http://www.ninebynine.org/#Contact
_______________________________________________ Haskell mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell
