But that would mean that `IsEq (F a) (F a)` (for some irreducible-for-now `F 
a`) is stuck, even when we're sure that it will eventually become True. Your 
approach is perhaps right, but it has negative consequences, too.

Richard

On Jul 2, 2014, at 9:58 AM, Brandon Moore <brandon_m_mo...@yahoo.com> wrote:

> That was the only thing I worried about, but any examples I tried with 
> families like that ended up with infinite type errors.
> Infinite types are not meant to be supported, which perhaps gives a solution 
> - the other sensible answer is bottom, i.e. a type checker error or perhaps 
> an infinite loop in the compiler. For instantating with a type family to 
> solve an equation that fails the occurs check, the type family has to be able 
> to already reduce (even if there are some variables), so just adopting the 
> policy that type families be fully expanded before the check would seem to 
> prevent IsEq (G a) [G a] from ever evaulating to true.
> 
> Brandon
> 
> 
> On Wednesday, July 2, 2014 7:11 AM, Richard Eisenberg <e...@cis.upenn.edu> 
> wrote:
> 
> 
> Hi Brandon,
> 
> Yes, this is a dark corner of GHC wherein a proper dragon lurks.
> 
> In your second example, you're suggesting that, for all types `a`, `a` is 
> never equal to `[a]`. The problem is: that's not true! Consider:
> 
> > type family G x where
> >   G x = [G x]
> 
> This is a well-formed, although pathological, type family. What should the 
> behavior of `IsEq (G Int) [G Int]` be? The only possible consistent answer is 
> `True`. This is why `IsEq a [a]` correctly does not reduce.
> 
> For further information, see section 6 of [1] and for a practical example of 
> how this can cause a program error (with open type families) see [2].
> 
> [1]: http://www.cis.upenn.edu/~eir/papers/2014/axioms/axioms.pdf
> [2]: https://ghc.haskell.org/trac/ghc/ticket/8162
> 
> It is conceivable that some restrictions around UndecidableInstances (short 
> of banning it in a whole program, including all importing modules) can 
> mitigate this problem, but no one I know has gotten to the bottom of it.
> 
> Richard
> 
> On Jul 2, 2014, at 4:19 AM, Brandon Moore <brandon_m_mo...@yahoo.com> wrote:
> 
>> From the user manual, it sounds like a clause of a closed type family should 
>> be rejected once no subsitution of the type could make it unify with the 
>> clause. If so, it doesn't seem to do an occurs check:
>> 
>> type family IsEq a b :: Bool where
>>   IsEq a a = True
>>   IsEq a b = False
>> 
>> > :kind! forall a . IsEq a a
>> forall a . IsEq a a :: Bool
>> = forall (a :: k). 'True
>> > :kind! forall a . IsEq a [a]
>> forall a . IsEq a [a] :: Bool
>> = forall a. IsEq a [a]
>> 
>> I came across this while trying to using Generics to find the immediate 
>> children of a term - this sort of non-reduction happens while comparing a 
>> type like (Term var) with a constructor argument of type var.
>> 
>> Brandon
>> _______________________________________________
>> Glasgow-haskell-users mailing list
>> Glasgow-haskell-users@haskell.org
>> http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
> 
> 
> 

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

Reply via email to