Enquanto eu não estava no comitê de design, acho que a sintaxe do registro foi modelada para ser consistente com a sintaxe da lista. A sintaxe de exportação do módulo também usa vírgulas, o único local real em que o layout é usado são as declarações de nível superior, onde cláusulas e do-notation.
Além disso, dado
data Foo = Foo {bar :: Int, baz :: Int}
escrita
fnord x = x { bar = 4 }
sem os chavetas entrariam em conflito com o restante da sintaxe e, usando o layout, como
fnord x = x
bar = 4
tornaria a sintaxe bastante quebradiça. Adicione um "where" no lugar errado e seu código significa algo completamente diferente.
Se você não estiver satisfeito com o estado dos registros em Haskell (e não ficaria sozinho com isso), recomendo que você dê uma olhada em fclabels ou até em elaborações de artigos de mesa elaborados como HList ou grapefruit-records (os dois últimos não estão sendo para os fracos de coração, mas também incrivelmente poderosos)
fclabels permitiria que você escrevesse (yay pointfree)
fnord = setL bar 4
assim como
getBar = getL bar
além de sua raison d'être real, que está compondo rótulos:
data Person = Person { _place :: Place, ... }
data Place = Place { _city :: String, ... }
moveToAmsterdam :: Person -> Person
moveToAmsterdam = setL (city . place) "Amsterdam"