
On Thu, Oct 3, 2013 at 9:44 PM, Brandon Allbery
On Thu, Oct 3, 2013 at 2:31 PM, Corentin Dupont
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, Indentation of 'case' itself doesn't matter. The layout is introduced by 'of', and then it's the indentation of the lexeme which follows 'of' that matters. So GHC is correct here. Roman