Ian said....
class Has (r :: *) (ft :: *) (f :: ft) (t :: *) where
(where ft stands for field type)?
This could also solve the representation-hiding problem:
foo.field would use the string "field" as the field name, as in the
proposal on the wiki page.
But foo.Field (capital first letter) would use the constructor Field
that is in scope. If you don't want to export the field getter then
capitalise the first letter and don't export the constructor.