[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