Name clashes in record fields
Jump to navigation
Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Question
error| Multiple declarations of ‘xxx’
I like to define:
data Human = Human {name :: String}
data Dog = Dog {name :: String}
Why is this forbidden?
I like to define:
data Human = Human {name :: String}
name :: Cat -> String
name = ...
Why is this forbidden, too?
Answer
The record field accessors name
are just functions
that retrieve the field's value from a particular record.
They are in the global scope together with top-level functions
and thus cannot have the same name.
For resolving this you may:
- rename the accessor or the top-level function
- put the data declaration or the top-level function in another module and import qualified
- write a typeclass with a
name
function and fit the non-accessor functionname
somehow into that.
Using language extension
The GHC Users Guide has a DuplicateRecordFields section.. The extension (GHC 8.0.1+) allow definition of record types with identically-named fields.