[GHC] #14549: RecordWildCards doesn't work properly in repl
GHC
ghc-devs at haskell.org
Sat Dec 2 02:36:24 UTC 2017
#14549: RecordWildCards doesn't work properly in repl
-------------------------------------+-------------------------------------
Reporter: akegalj | Owner: (none)
Type: bug | Status: new
Priority: lowest | Milestone:
Component: GHCi | Version: 8.2.1
Resolution: | Keywords: repl,
| recordwildcards
Operating System: Unknown/Multiple | Architecture:
Type of failure: Incorrect result | Unknown/Multiple
at runtime | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by AntC):
I would expect an error; the question is what error?
If you write that code as a program, the compiler doesn't go past the
second line: `Multiple declarations of ‘t1’`
* The declaration for `Test` puts name `t1` in scope -- as a field
selector function.
* The `t1 = 2` (tries to) create a different declaration of `t1` ===>
fail.
In the repl, I guess the `t1 = 2` shadows `Test`'s declaration of `t1`, so
you don't get a failure at that point.
This works:
{{{
data Test = Test { t1 :: Int, t2 :: Int } deriving Show
tt = let t1 = 2 in Test { t2 = 2, ..}
main = print tt
}}}
You might also get your code to work if you compiled the declaration for
`Test` into a separate module and imported it. (In effect that's what I'm
doing with the `let`.) Then `t1` would refer to your local variable, and
wouldn't clash with imported `t1`. In an expression using record syntax
`Test { t2 = 2, t1 = t1 }`, the lhs `t1` must be a field label, the rhs
`t1` must be your local variable. Then `Test { t2 = 2, .. }` should work.
In general, the repl is a tool for hacking quick-and-dirty. Don't expect
that if it accepts some line of code you have an overall coherent program.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14549#comment:1>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list