Difference between revisions of "Name clashes in record fields"

From HaskellWiki
Jump to navigation Jump to search
(Duplicate record fields extension)
(prime link fix)
Line 36: Line 36:
 
== See also ==
 
== See also ==
   
* [http://hackage.haskell.org/trac/haskell-prime/wiki/TypeDirectedNameResolution Type directed name resolution]
+
* [http://prime.haskell.org/wiki/TypeDirectedNameResolution Type directed name resolution]
 
* 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]
   

Revision as of 19:16, 4 April 2019

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 function name somehow into that.

Using language extension

DuplicateRecordFields extension (GHC 8.0.1+) allow definition of record types with identically-named fields.

See also