Difference between revisions of "Name clashes in record fields"

From HaskellWiki
Jump to: navigation, search
(initialized from a Haskell-Cafe thread)
 
(Duplicate record fields extension)
Line 1: Line 1:
 
== Question ==
 
== Question ==
  +
<code> error| Multiple declarations of ‘xxx’ </code>
   
 
I like to define:
 
I like to define:
Line 6: Line 7:
 
data Dog = Dog {name :: String}
 
data Dog = Dog {name :: String}
 
</haskell>
 
</haskell>
Why is this forbidden?
 
  +
 
Why is this forbidden?
   
 
I like to define:
 
I like to define:
Line 28: Line 30:
 
* write a typeclass with a <hask>name</hask> function and fit the non-accessor function <hask>name</hask> somehow into that.
 
* write a typeclass with a <hask>name</hask> function and fit the non-accessor function <hask>name</hask> somehow into that.
   
  +
=== Using [[language extension]] ===
  +
  +
<code>[https://downloads.haskell.org/~ghc/master/users-guide/glasgow_exts.html#duplicate-record-fields DuplicateRecordFields]</code> extension (GHC 8.0.1+) allow definition of record types with identically-named fields.
   
 
== See also ==
 
== See also ==

Revision as of 08:51, 14 February 2017

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