# faking universal quantification in constraints

Nicolas Frisby nicolas.frisby at gmail.com
Tue Apr 17 22:01:56 CEST 2012

```In http://hpaste.org/67172, I've simplified your demonstration to
define a function

> uhoh :: forall a b. Dict (a ~ b)

Essentially, I had forgot about ~ constraints.

The reason I wasn't exporting Skolem was so that if there were a
satisfiable constraint (c Skolem), I could infer that the
corresponding instances was totally polymorphic in the argument.
That's bogus reasoning because of ~ (and hence fundeps, as you used).

Thanks again.

On Tue, Apr 17, 2012 at 2:14 PM, Nicolas Frisby
<nicolas.frisby at gmail.com> wrote:
> Thanks! I'll analyze what you've done here.
>
> One thing that jumps out at me is that you're using flop twice. I
> think this violates an invariant that I was trying(/"hoping") to
> maintain by not exporting Skolem. I'll let you know once I look at it
> longer.
>
> Thanks for taking the time to do this.
>
> On Tue, Apr 17, 2012 at 1:40 PM, Dimitrios Vytiniotis
> <dimitris at microsoft.com> wrote:
>>
>> Hi Nick, I cannot say that I understand very well what you have in your mind, nor the
>> signatures of the classes you have in your module, but as you expected your program
>> is unsafe (and I've probably attached one of the most obfuscated ways to show it, many
>> apologies for this! At least my code can offer a good laugh to people :-))
>>
>> Because I do not understand what you are doing in this module, I also do not understand
>> how to make it safer -- I just can safely tell you that using your forall_S one can create a
>> Leibniz equality:
>>
>>         forall a c.  c Skolem -> c a
>>
>> which (by a free theorem) means that ALL types must be equal to Skolem, and my code
>> exploits exactly this to equate Char to Skolem to Int -> Int. The fact that you can't name
>> Skolem in the new module because it is not exported is kind of irrelevant ...
>>
>> Regarding impredicativity in GHC, we are still unfortunately on the whiteboard ...
>>
>> Hope this helps!
>>
>> d-
>>
>>
>>
>>
>>> -----Original Message-----
>>> users-bounces at haskell.org] On Behalf Of Nicolas Frisby
>>> Sent: Monday, April 16, 2012 11:58 PM
>>> Subject: faking universal quantification in constraints
>>>
>>> I'm simulating skolem variables in order to fake universal quantification in
>>> constraints via unsafeCoerce.
>>>
>>>   http://hpaste.org/67121
>>>
>>> I'm not familiar with various categories of types from the run-time's
>>> perspective, but I'd be surprised if there were NOT a way to use this code to
>>> create run-time errors.
>>>
>>> Is there a way to make it safer? Perhaps by making Skolem act more like
>>> GHC's Any type? Or perhaps like the -> type? I'd like to learn about the
>>> varieties of types from the run-time's perspective.
>>>
>>> I know Dimitrios Vytiniotis is trying to implement these legitimately in GHC,
>>> but I don't know much about that project's status, nor any documentation
>>> indicating how to try it out in GHC HEAD (e.g. what's the syntax?). Is there a
>>> page on the GHC wiki or something to check that sort of thing?
>>>
>>> I wonder how far this Forall_S trick can take me in the interim towards
>>> Vytiniotis' objective functionality when paired with a (totally safe) class for
>>> implication.
>>>
>>> > class Implies (ante :: Constraint) (conc :: Constraint) where
>>> >   impliesD :: Dict ante -> Dict conc
>>>
>>> Thanks,
>>> Nick
>>>
>>> _______________________________________________
>>> Glasgow-haskell-users mailing list