| Oh ye Haskell wizards. Is the following program syntactically legal | or not? | | x = let a = let { b=1; | c=2 | } in 3 | in 4 | | I.e. is the layout rule from an outer scope in effect even inside | explicit brackets? Obviously, this needs clarification. There would seem to be three possibilities: 1) Layout from an outer scope applies even within explicit brackets. 2) Layout can be used in a nested scope inside explicit brackets, but indentations from outside the brackets do not apply. 3) Layout is never in effect within explicit brackets. I favor (3) for its simplicity, although (2) is also sensible. (1) seems like a bad idea. | Here's another | | x = let a = let | in 3 | in 4 | | OK, what happens? First we insert an lcurl after the first let and | remember the indentation (8). Then the second let will get an lcurl | at indentation 3 (position of in). But 3 is less than 8 so there also be | an rcurl from the first let. The last in will have an rcurl inserted because | otherwise we would have a syntax error. So we get | | x = let { a = let | {}in 3 | }in 4 | | This is a correct program, but the curls in the empty let were not inserted | by matching constructs!! | | | -- Lennart & Niklas I think this could be clarified by a slight rewording of the layout rules: Rather than saying that a layout indentation is established by the first token other than { following one of the herald keywords, say that anywhere the grammar has { decls } a layout indentation is established by the first token of decls , if any, in the absence of a preceding {. Thus, in the above example, there is no layout for the inner let. Of course, this rule is no longer purely lexical, but that is the case with inserted }s anyway. --Joe