I agree. It's confusing. I tend to surround records in parentheses just to make my intention clear, even when it's not needed. Ivan On Sat, 22 Aug 2026 at 18:29, amindfv--- via Haskell-Cafe < haskell-cafe@haskell.org> wrote:
To highlight the point about expressions, I've found many beginners are surprised by the behavior of code like this:
ghci> data Foo = Foo { foo :: Int } ghci> bar (Foo n) = n + 5 ghci> bar Foo { foo = 9 } 14
To point out a case where this can lead to real bugs, imagine:
ghci> data State = State { new :: String, old :: String } deriving (Show) ghci> backup s = s { old = new s } ghci> backup (State "v1" "v0") { new = "v2" } State {new = "v2", old = "v2"}
Many might expect this to return (State "v2" "v1"), thinking function application would have higher precedence than the record update.
- Tom
On 08/18/2026 4:49 PM CEST Tikhon Jelvis <tikhon@jelv.is> wrote:
Just Foo { foo = 42 } is valid Haskell syntax. I actually take advantage of this in patterns sometimes, although it can definitely be a bit confusing. (And in expressions, I 100% would have extra parentheses, otherwise it's too visually confusing.)
On Tue, Aug 18, 2026 at 7:45 AM Johannes Waldmann via Haskell-Cafe < haskell-cafe@haskell.org> wrote:
Dear Cafe,
I could use a parser that is equivalent to the one produced by "deriving Read" but ...
A) faster, and using less space (Data.Text(.Lazy) instead of String) B) streaming (parse a long list literal "[0,1,2, ... ]" in constant space, produce the first cons of the result right after reading "[0") C) with some minimal error reporting (e.g., some prefix of not-consumed input)
perhaps attoparsec with some form of early-commited choice?
I do have something (only for A) at https://codeberg.org/jwaldmann/text-read (attoparsec on lazy text) and it seems twice as fast as "deriving Read" in my tests.
NB: I was quite shocked to see that "deriving Read" accepts "Just Foo { foo = 42 }" (no parentheses around the record literal) (while "deriving Show" produces them).
- J.W.
_______________________________________________ Haskell-Cafe mailing list -- haskell-cafe@haskell.org To (un)subscribe, modify options or view archives go to: Only members subscribed via the mailman list are allowed to post.
Haskell-Cafe mailing list -- haskell-cafe@haskell.org To (un)subscribe, modify options or view archives go to: Only members subscribed via the mailman list are allowed to post.
Haskell-Cafe mailing list -- haskell-cafe@haskell.org To (un)subscribe, modify options or view archives go to: Only members subscribed via the mailman list are allowed to post.