[Haskell-cafe] How to understand `|` in this code snippet ?

zaxis z_axis at 163.com
Sat Feb 27 21:34:58 EST 2010


thanks! 

case timeout of
  Just str ->
    case reads str of
      [(t,_)] -> addtimeout (hPutStrLn stderr "*** TIMEOUT" >> _exit 1)
      _ -> return ()
  _ -> return () 

is VERY clear!


Daniel Fischer-4 wrote:
> 
> 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
> 
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
> 
> 


-----
fac n = let {  f = foldr (*) 1 [1..n] } in f 
-- 
View this message in context: http://old.nabble.com/How-to-understand-%60%7C%60-in-this-code-snippet---tp27726581p27732673.html
Sent from the Haskell - Haskell-Cafe mailing list archive at Nabble.com.



More information about the Haskell-Cafe mailing list