[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