Name clashes in record fields
From HaskellWiki
1 Question
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?
2 Answer
The record field accessorsname
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 function and fit the non-accessor functionnamesomehow into that.name
3 See also
- Type directed name resolution
- Haskell-Cafe on Record types and unique names
