Ähnliche Gruppen gibt es in Haskell selbst: bei let, where und do-Notation. Die sind offiziell mit Klammern und Semikolons definiert.
Diese Strukturierung kann man aber auch durch Einrücken und Untereinanderschreiben verdeutlichen, die Extrazeichen sind bei ordentlichem Layout nicht nötig (also hinderlich).
Wir haben sie auch bis jetzt in den Quelltexten recht selten angetroffen. Man darf sie nämlich tatsächlich weglassen. Die Regel dazu ist: wenn nach let, where, do eine öffnende geschweifte Klammer folgt, dann ist weitere explizite Gruppierung (Semikolons, Klammer zu) Pflicht. Folgt jedoch ein anderes Zeichen (Kommentare ignorieren wir), dann denkt sich der Parser die öffnende Klammer hinein, und vor alle weiteren Zeilen Semikolons, bis eine Zeile erscheint, die weniger weit eingerückt ist. Vor diese wird magisch die schließende Klammer eingesetzt.
Beispiel
let x = 5 let {x = 5 y = 6 ;y = 6 in x + y }in x + y
(Die offizielle Definition aus dem Haskell-Report ist hier.)
Bemerkung: warum sieht man überhaupt noch die Möglichkeit expliziter Gruppierung vor? Menschen schreiben solche Programme nicht, aber vielleicht Maschinen: man will es Programmtransformatoren nicht unnötog schwer machen, d. h. diese nicht verpflichten, bei der Ausgabe von Programmtext auf das Layout Rücksicht zu nehmen. Mit expliziten Klammern und Semikolons dürfen diese beliebig umgebrochenen Fließtext schreiben.
Die Layout-Regel läßt sich mit dem gezeigten Position-Parser leicht implementieren, da wir eben die Einrückungstiefe jedes Zeichens mit in den Eingabestrom schreiben.
Bemerkung: es ist trotzdem (wenigstens mir) nicht so klar, ob soviel versteckte Änderungen des Eingabetextes eine softwaretechnisch gute Idee sind. Man kann die Layout-Regel eine ganze Weile lang ignorieren (d. h. rein intuitiv benutzen), aber irgendwann gibts dann doch unverständliche Fehlermeldungen. Oder der Compiler hat einen cleveren Parser, der richtig bescheid sagen kann.