Name clashes in record fields: Difference between revisions
(link to latest released user guide, not master) |
(fix link to haskell prime wiki) |
||
Line 36: | Line 36: | ||
== See also == | == See also == | ||
* [ | * [https://gitlab.haskell.org/haskell/prime/-/wikis/type-directed-name-resolution ''Type directed name resolution'' in the Haskell Prime Wiki] | ||
* Haskell-Cafe on [http://www.haskell.org/pipermail/haskell-cafe/2010-December/087859.html Record types and unique names] | * Haskell-Cafe on [http://www.haskell.org/pipermail/haskell-cafe/2010-December/087859.html Record types and unique names] | ||
[[Category:FAQ]] | [[Category:FAQ]] |
Revision as of 06:23, 10 December 2020
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
DuplicateRecordFields
extension (GHC 8.0.1+) allow definition of record types with identically-named fields.