[Haskell-cafe] How to understand `|` in this code snippet ?
Daniel Fischer
daniel.is.fischer at web.de
Sat Feb 27 20:43:50 EST 2010
Am Sonntag 28 Februar 2010 02:08:18 schrieb zaxis:
> Then can i change it to :
> case timeout of
> Just str -> do
> [(t, _)] <- reads str
> addTimeout t (hPutStrLn stderr "*** TIMEOUT" >> _exit 1)
> return ()
> _ -> return ()
>
> Sincerely!
No. The "| [(t,_)] <- reads str" in
case timeout of
Just str | [(t,_)] <- reads str -> ...
is a "pattern guard", not a monadic bind (and where "p <- reads str" is a
monadic bind, it's in the list monad).
You can change it to
case timeout of
Just str ->
case reads str of
[(t,_)] -> addtimeout (hPutStrLn stderr "*** TIMEOUT" >> _exit 1)
_ -> return ()
_ -> return ()
but why would you?
>
> Brandon S. Allbery KF8NH wrote:
> > On Feb 27, 2010, at 04:07 , zaxis wrote:
> >> xxxMain = do
> >> timeout <- getEnv "xxx_TIMEOUT"
> >> case timeout of
> >> Just str | [(t, _)] <- reads str -> do
> >> addTimeout t (hPutStrLn stderr "*** TIMEOUT" >> _exit 1)
> >> return ()
> >> _ -> return ()
> >> .......
> >>
> >> What does the `|` mean in "Just str | [(t, _)] <- reads str" ?
> >> Is it a logical `or` ?
> >
> > It's a guard. Same as with function definitions (in fact, function
> > definitions of that form are converted to case expressions).
> >
> > --
> > brandon s. allbery [solaris,freebsd,perl,pugs,haskell]
> > allbery at kf8nh.com system administrator [openafs,heimdal,too many hats]
> > allbery at ece.cmu.edu electrical and computer engineering, carnegie
> > mellon university KF8NH
More information about the Haskell-Cafe
mailing list