On 12/28/11 1:34 PM, Donn Cave wrote:
Quoth Greg Weber<g...@gregweber.info>,
On Wed, Dec 28, 2011 at 2:12 PM, Donn Cave<d...@avvanta.com>  wrote:
...
I would think row polymorphism is a must-have.


Perhaps if you want *extensible* records. If you would like to make some
progress with records in the near future rather than keeping records in
limbo, I think we really need to give up for the moment on any higher form
of abstraction than straight-forward name-spacing.

No, to be clear on that, I haven't given much thought to extensibility
per se, I was thinking row polymorphism is a valuable feature on its own,
and extensibility just seemed to me to be an implicit side benefit.

Yes, row polymorphism would still be helpful in lack of extensible records. In particular it allows for easily determining principle (structural) types of records; this is desirable from a generic programming perspective even if records on the whole are not structurally typed.

That is, we can distinguish the following types

    data Foo = MkFoo { x :: T }

    data Bar = MkBar { x :: T }

By considering them to desugar into

    type Foo = { __type :: Foo , x :: T }
    constructor MkFoo :: T -> Foo
    pattern MkFoo :: T -> Pattern

    type Bar = { __type :: Bar , x :: T }
    constructor MkBar :: T -> Bar
    pattern MkBar :: T -> Pattern

    accessor x :: { x :: T , ... } -> x

Of course, an actual implementation needn't come up with a phantom argument like __type in order to nominally distinguish structurally identical types. Rather, the existence of the hack shows that it's doable.

--
Live well,
~wren

_______________________________________________
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to