Identifier is not a record selector [GHC-47535]
Within a record update expression r { selector1 = ..., ..., selectorN = ... }, the selectors selector1 … selectorN must be bound by a record constructor declaration.
Examples
Identifier is a top-level binding, not a record selector
The identifier foo is used as a record selector, but is never declared as such.
Using bar fixes the error, since it is declared as a selector of the Bar record.
Error Message
NotARecordSelector.hs:6:13: error: [GHC-47535]
• ‘foo’ is not a record selector
• In the expression: x {foo = 1}
In an equation for ‘foo’: foo x = x {foo = 1}
|
6 | foo x = x { foo = 1 }
| ^^^
NotARecordSelector.hs
Before
module NotARecordSelector where
newtype Bar = Bar { bar :: Int }
foo :: Bar -> Bar
foo x = x { foo = 1 }
After
module NotARecordSelector where
newtype Bar = Bar { bar :: Int }
foo :: Bar -> Bar
foo x = x { bar = 1 }
Identifier is a class method, not a record selector
The identifier foo is used as a record selector, but it refers to a function of the Foo class instead.
Using bar fixes the error, since it is a selector of the Bar record.
This error can only occur when the type of the record is ambiguous, in the example below this is achieved by the use of undefined.
Error Message
NotARecordSelector.hs:9:20: error: [GHC-47535]
• ‘foo’ is not a record selector
• In the expression: undefined {foo = ()}
In an equation for ‘test’: test = undefined {foo = ()}
|
9 | test = undefined { foo = () }
| ^^^
NotARecordSelector.hs
Before
module NotARecordSelector where
class Foo a where
foo :: a -> ()
data Bar = Bar { bar :: () }
test :: Bar
test = undefined { foo = () }
After
module NotARecordSelector where
class Foo a where
foo :: a -> ()
data Bar = Bar { bar :: () }
test :: Bar
test = undefined { bar = () }