I solve this in protocol buffers by putting things like Issue
and Version
in separate files in the same hierarchy.
Haskell only uses separate modules to control namespaces, so this is the orthodox solution.
Much much fancier: use type classes to define available name:
class Has'self a b | a -> bwhere
get'self :: a -> b
set'self :: b -> a -> b
instance Has'self Issue String where ...
instance Has'self Version String where ....
EDIT: The comments below remind me to give more verbose advice. Do not use Has'self like solutions -- those that have gone that road report it gets ugly. I can vouch for the path of separate modules.
PS: Perhaps you can use the lens library for your fields!