On Thu, Jan 27, 2011 at 11:00 AM, Magicloud Magiclouds <[email protected]> wrote: > On Thu, Jan 27, 2011 at 10:48 AM, Brandon S Allbery KF8NH > <[email protected]> wrote: >> -----BEGIN PGP SIGNED MESSAGE----- >> Hash: SHA1 >> >> On 1/26/11 21:10 , Magicloud Magiclouds wrote: >>> Hi, >>> Consider such a case: I'm making a client program. There is a >>> process, client and server exchange some information in a strict >>> order. So I do (persudo code): >>> exchange = do >>> sendHello >>> readMsg >>= expect hello processHelloReply >>> sendWhatsyourname >>> readMsg >>= expect name processNameReply >>> >>> And expect is something like: >>> expect c f (cmd, msg) = >>> if c == cmd then >>> f msg >>> else >>> fail "unexpected" >>> >>> This is OK until this situation: The server may send some special >>> command, for example DEBUG, DISCONNECT. This breaks the process above. >>> So I think I could throw the unexpected command to outer function to >>> handle. Something like: >>> main = do >>> connect >>> catch exchange $ \e -> do >>> case e of >>> UnexpectedCMD DEBUG -> -- ignore process >>> UnexpectedCMD DISCONNECT -> -- disconnect process >>> _ -> -- something really wrong >>> >>> Well, with Control.Exception, I do not know how to make this done. >> >> It looks to me like the very example in the Control.Exception documentation >> will do this, with some renaming. >> >>> -- many languages call this a "control exception"; think break/next >>> -- etc. It's an exception used internally to modify control flow. >>> data ControlException = CEDebug | CEDisconnect >>> deriving (Show, Typeable) >>> >>> instance Exception ControlException >> >> So now you can trap your ControlException above, or anything else is >> presumably a true exception. >> >> >> - -- >> brandon s. allbery [linux,solaris,freebsd,perl] [email protected] >> system administrator [openafs,heimdal,too many hats] [email protected] >> electrical and computer engineering, carnegie mellon university KF8NH >> -----BEGIN PGP SIGNATURE----- >> Version: GnuPG v1.4.11 (Darwin) >> Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ >> >> iEYEARECAAYFAk1A3RgACgkQIn7hlCsL25XRMgCeNEImC8VWPiM0fHB5Bu2ooFc8 >> nz8An0TwHXXUxJl7bhndSVf2vxWbXpGf >> =HIqR >> -----END PGP SIGNATURE----- >> >> _______________________________________________ >> Haskell-Cafe mailing list >> [email protected] >> http://www.haskell.org/mailman/listinfo/haskell-cafe >> > > This is one way. But so the outer function could not know what > happened in "really wrong" situation. > > -- > 竹密岂妨流水过 > 山高哪阻野云飞 >
Sorry, in last mail, I meant, in really wrong situation, there might be other tens of unexpected command, I'd like to wrap them in one exception, other than making tens of exceptions. -- 竹密岂妨流水过 山高哪阻野云飞 _______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
