Thanks all,

So, in a do expression 

 let x = 1
     y = 2
     etc.
   in z = 1 + 2

  if <bool expr>
    then
      etc.
    else
      etc.

Is this deviation documented somewhere?

Michael

--- On Thu, 10/8/09, Brandon S. Allbery KF8NH <allb...@ece.cmu.edu> wrote:

From: Brandon S. Allbery KF8NH <allb...@ece.cmu.edu>
Subject: Re: [Haskell-cafe] Let it be
To: "michael rice" <nowg...@yahoo.com>
Cc: "Brandon S. Allbery KF8NH" <allb...@ece.cmu.edu>, haskell-cafe@haskell.org
Date: Thursday, October 8, 2009, 11:53 AM

On Oct 8, 2009, at 11:43 , michael rice wrote:This doesn't:

import System.Random
main = do
  gen <- getStdGen
  let (randNumber, newGen) = randomR (1,6) gen :: (Int, StdGen)
  in putStrLn $ "Number is " ++ show randNumber

[mich...@localhost ~]$ runhaskell zz.hs

zz.hs:4:2:
    The last statement in a 'do' construct must be an expression

The problem here is that the "do" construct parses things a bit differently; if 
you're at the same indentation level, it inserts a (>>) on the assumption that 
the next line is an independent expression, so you need to indent the "in" a 
bit more to avoid it.
Note however that this usage is common enough that "do" provides a shorthand:  
you can simply omit the "in", and "let" will be parsed as if it were a 
statement:
> main = do>   gen <- getStdGen>   let (randNumber, newGen) = randomR (1,6) gen 
> :: (Int,StdGen)>   putStrLn $ "Number is " ++ show randNumber
 -- brandon s. allbery [solaris,freebsd,perl,pugs,haskell] 
allb...@kf8nh.comsystem administrator [openafs,heimdal,too many hats] 
allb...@ece.cmu.eduelectrical and computer engineering, carnegie mellon 
university    KF8NH
 



      
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to