Name clashes in record fields

From HaskellWiki
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 function name 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.

See also