[Haskell-cafe] Problems with do notation
Thomas Schilling
nominolo at googlemail.com
Thu Nov 22 03:30:36 EST 2007
On Thu, 2007-11-22 at 09:19 +0100, Peter Verswyvelen wrote:
> worksFine =
> if True
> then putStrLn "True"
> else putStrLn "False"
>
> worksNOT = do
> if True
> then putStrLn "True"
> else putStrLn "False"
>
> worksAgain = do
> if True
> then putStrLn "True"
> else putStrLn "False"
>
> Of course the worksFine function returns an IO action, so has
> different behavior, but I mean the indentation is different. Is this
> by design?
>
>
> Also the following is rather strange:
>
> doubleDefError = let x = 1
> x = 2
> in x * x
>
> alsoDoubleDefError = do
> let x = 1
> x = 2
> return (x*x)
>
> doubleDefNOERROR = do
> let x = 1
> let x = 2
> return (x*x)
>
> Now I understand why this is (the second let starts a new invisible
> scope no?), but for newbies, this is all very strange :-)
Now go and read about 'mdo' (recursive 'do' notation) ;)
BTW, don't you get the same behaviour?
foo = let x = 1 in
let x = 2 in
x * x
More information about the Haskell-Cafe
mailing list