On Thu, Oct 3, 2013 at 2:31 PM, Corentin Dupont <corentin.dupont@gmail.com> wrote:
test :: Bool -> IO ()
test foo = do
   let bar = case foo of
       True ->  "Foo";
       False -> "Bar"
   return ()


while this one does (just adding one space in front of True and False):

test :: Bool -> IO ()
test foo = do
   let bar = case foo of
        True ->  "Foo";
        False -> "Bar"
   return ()

Do you understand how layout works? Informally, something that is more indented is a continuation of the previous expression, while something equally or less indented is a new expression. In this case, the previous expression is `bar = case foo of` and indenting `True` to the same level as `bar` means you have ended the expression starting with `bar =`. Adding just one extra space indicates that it's still part of `bar =`.

(ghc is actually being somewhat lenient here; strictly speaking, you are not indented beyond the `case` so it should have ended the `case` expression. ghc allows some sloppiness like this when there absolutely must be something else after, but there are limits mostly imposed by layout introducers like `let` and `do`.)

--
brandon s allbery kf8nh                               sine nomine associates
allbery.b@gmail.com                                  ballbery@sinenomine.net
unix, openafs, kerberos, infrastructure, xmonad        http://sinenomine.net