New implementation for `ImpredicativeTypes`
John Ericson
john.ericson at obsidian.systems
Wed Sep 8 04:48:31 UTC 2021
On 9/7/21 8:41 PM, Richard Eisenberg wrote:
>
>
>> On Sep 6, 2021, at 11:21 AM, John Ericson
>> <john.ericson at obsidian.systems
>> <mailto:john.ericson at obsidian.systems>> wrote:
>>
>> On 9/2/21 11:04 PM, Richard Eisenberg wrote:
>>
>>> On Sep 2, 2021, at 2:56 PM, john.ericson
>>> <john.ericson at obsidian.systems
>>> <mailto:john.ericson at obsidian.systems>> wrote:
>>>>
>>>> Does the most basic e.g.
>>>>
>>>> newtype Some f where
>>>> MkSome :: forall a. f a -> Some f
>>>>
>>>> Have one of those problematic equalities?
>>>
>>> No. That's not a GADT -- the constructor doesn't restrict anything
>>> about `f`.
>>
>> Morally, sure, but GHC doesn't know about this.
>>
>
> Sure it does -- GHC doesn't include an equality constraint as one of
> the fields of MkSome. This isn't about extensions -- it's about the
> way the data constructor is interpreted.
Oops, agreed. I guess meant extensions didn't seem to check for this in
a really syntax-driven way. But yes deciding the cases apart is not hard
once the data definition is compiled.
>>>
>>> I think you're after newtype existentials. I think these should
>>> indeed be possible, because what you propose appears to be the same as
>>>
>>> newtype Some f = MkSome (exists a. f a)
>>>
>>> We can probably support the syntax you wrote, too, but I don't want
>>> to commit to that right now.
>>
>> The syntax I wrote is already basically valid?
>>
>> data Some f = forall a. Some (f a)
>> data Some f where MkSome :: forall a f. f a -> Some f
>>
>> Is accepted
>>
>> newtype Some f = forall a. Some (f a)
>> newtype Some f where MkSome :: forall a f. f a -> Some f
>>
>> Is not with "A newtype constructor cannot have existential type
>> variables"
>>
>> I propose we teach GHC how these "GADTs" in fact merely have
>> existential variables, and not the FC constraints that require the
>> extra evaluation for soundness. Than we can get the
>> operational/runtime benefits of what you propose for cheap. Don't get
>> me wrong -- the other aspects in the paper this doesn't address are
>> still quite valuable, but I think this is a useful stepping stone /
>> removal of artificial restrictions we should do first.
>>
>> This sort of thing is brought up in #1965, where it is alleged this
>> is in fact more difficult than it sounds. All more reason it is a
>> good stepping stone, I say!
>>
>
> This is more difficult than it sounds. :) Newtypes are implemented via
> coercions in Core, and coercions are inherently bidirectional. The
> appearance of an existential in this way requires one-way conversions,
> which are currently not supported. So, to get what you want, we'd have
> to modify the core language as in the existentials paper, along with
> some extra work to automatically add `pack` and `open` -- rather
> similar to the type inference described in the existentials paper. The
> bottom line for me is that this seems just as hard as implementing the
> whole thing, so I see no value in having the stepping stone. If we
> always wrote out the newtype constructor, then maybe we could use its
> appearance to guide the `pack` and `open` but we don't: sometimes, we
> just use `coerce`. So I really don't think this is any easier than
> implementing the paper as written. Once that's done, we can come back
> and add this new feature relatively easily (I think).
Makes sense. That route is indeed harder than I was thinking.
There was a time before coercions when I gather newtypes were mostly
implemented with a special-case lowering to STG. I imagine it would be
quite easy to implement this that way, but that door is now mostly shut.
I had a few more thoughts, but I am not sure if I should trouble the
list with them as they are still a bit rough around the edges. Suffice
to say, I hope we could sort of "smooth out" the feature space a bit so
that these and GADTs are not completely different, e.g. I think all
existential variables can be projected like this (I opened #20337 for
this), and perhaps connect GADTs to the existentials with evidence you
mention in the "future work" section, so "true" GADTs also have
structural counterparts in a similar way.
Happy to just continue mulling on it until a proposal or something,
however. :)
John
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-devs/attachments/20210908/44be3355/attachment.html>
More information about the ghc-devs
mailing list