Records in Haskell
AntC
anthony_clayden at clear.net.nz
Tue Feb 28 09:57:58 CET 2012
wren ng thornton <wren <at> freegeek.org> writes:
>
> FWIW, this is the concern I alluded to earlier. Namely that we may want
> to have two (or more), er, 'classes' of records--- where a field is
> polymorphic over an individual class, but we don't want those classes to
> merge simply because they happened to choose the same name and type for
> the field.
>
I agree 'classes' is a misleading word for that. Isn't what you want two (or
more) namespaces for records -- that is, for their fields?
This is the DORF approach. (Barney seems to be describing the SORF approach --
he's got DORF wrong.)
One of the namespaces includes Product.name; another Person.name. (So I'm
taking a namespace as equivalent to a module.) You can have multiple records
with a `name` field in each module (Customer, Employee, Business Contact,
etc) -- so this is already better than H98.)
Providing you're coding in a module that imports only one of those namespaces,
you can use `name` unqualified.
If you're coding in a module that imports both, you must use `name` qualified.
If you try to apply (Product.name customer) you'll get a type failure (no
instance).
> I'm not sure it's a good proposal, but it seems like the only way to
> handle this issue is to (1) introduce a new kind for
> semantically-oriented field names,
That's what SORF does: the String Kind
> and (2) make the Has class use that
> kind rather than a type-level string.
No proposal is using a _type_-level string. Barney's confused you.
DORF uses a type (regular importable/qualifiable/hidable) with a prefix to the
field name:
data Proxy_name
Where you're in a module that imports both the `name`s per above, the
desugarrer would generate Product.Proxy_name and Person.Proxy_name.
(That's all rather awkward to get right, which is why I prefer the sugar.)
By (1), what I mean is that rather
> than referring to the field as "name", we would declare PersonalName and
> BrandName and then use those in lieu of the string. And if we do that,
> then (2) demands that we must somehow make explicit which one we mean,
> should we want the `name` field to be polymorphic for some given record
> declaration.
>
AntC
More information about the Glasgow-haskell-users
mailing list