[Haskell] return?

Ben_Yu at asc.aon.com Ben_Yu at asc.aon.com
Fri Apr 30 11:40:50 EDT 2004





Thanks you guys. I really love this mail list. Can always learn nice tips
from experienced people here. :-)

I guess I'll go with the guard suggestion. ContT is nice, but don't want to
introduce too much extras to the program just for syntax reason.

I do agree with you, Graham. Actually
do
  do
    earlyreturn 1
    return 2
return 3

is equivalent to:

do
  earlyreturn 1
  return 2
  return 3

While the first should be 3 by intuition. the second should be 1.

I guess that's the reason why imperative return is not possible in monad.




                                                                                                                                       
                      Graham Klyne                                                                                                     
                      <GK at ninebynine.or        To:       Ben_Yu at asc.aon.com, haskell at haskell.org                                       
                      g>                       cc:                                                                                     
                                               Subject:  Re: [Haskell] return?                                                         
                      04/30/2004 04:45                                                                                                 
                      AM                                                                                                               
                                                                                                                                       





>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
>Haskell at haskell.org
>http://www.haskell.org/mailman/listinfo/haskell

------------
Graham Klyne
For email:
http://www.ninebynine.org/#Contact





More information about the Haskell mailing list