Sebbene non fossi membro del comitato di progettazione, ritengo che la sintassi del record sia stata modellata per essere coerente con la sintassi delle liste. La sintassi di esportazione del modulo utilizza anche le virgole, l'unico posto reale in cui viene utilizzato il layout è le dichiarazioni di livello superiore, dove clausole e notazione.
Inoltre, dato
data Foo = Foo {bar :: Int, baz :: Int}
scrittura
fnord x = x { bar = 4 }
senza le parentesi si scontrerebbe con il resto della sintassi e usando il layout, come
fnord x = x
bar = 4
renderebbe la sintassi abbastanza fragile. Aggiungi un "dove" nel posto sbagliato e il tuo codice significa qualcosa di completamente diverso.
Se non sei soddisfatto dello stato dei record in Haskell (e non saresti rimasto solo con questo), ti consiglio di dare un'occhiata a fclabels o anche elaborato hackery typeclass come HList o grapefruit-records (questi ultimi due non sono per i deboli di cuore, ma anche follemente potenti)
fclabels ti permetterebbe di scrivere (yay pointfree)
fnord = setL bar 4
così come
getBar = getL bar
in cima alla sua vera ragion d'essere, che sta componendo le etichette:
data Person = Person { _place :: Place, ... }
data Place = Place { _city :: String, ... }
moveToAmsterdam :: Person -> Person
moveToAmsterdam = setL (city . place) "Amsterdam"