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.com
system administrator [openafs,heimdal,too many hats] allb...@ece.cmu.edu
electrical and computer engineering, carnegie mellon university    KF8NH


Attachment: PGP.sig
Description: This is a digitally signed message part

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

Reply via email to