<div dir="ltr"><div><div>Hi,<br><br>AntC's f can be done without -XOverlappingInstances <<a href="http://lpaste.net/7559485273839501312">http://lpaste.net/7559485273839501312</a>>, using the trick didn't work in #9918. I'm not sure extra syntax is justified to clean up this rare case.<br><br></div>Regards,<br></div>Adam <br><div><div><table class="" cellpadding="0"><tbody><tr><td class="" style="width:auto"><span name="AntC" class=""></span><br></td></tr></tbody></table><table class="" cellpadding="0"><tbody><tr><td class="" style="width:auto"><span name="AntC" class=""></span><br></td></tr></tbody></table><table class="" cellpadding="0"><tbody><tr><td class="" style="width:auto"><span name="AntC" class=""></span><br></td></tr></tbody></table></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Jun 7, 2015 at 11:12 AM, Dan Doel <span dir="ltr"><<a href="mailto:dan.doel@gmail.com" target="_blank">dan.doel@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">It seems to me the problem is that there's no way to define classes by consecutive cases to match the family definitions. I don't know what a good syntax for that would be, since 'where' syntax is taken for those. But it seems like it would correspond fill the hole here.<br></div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Jun 7, 2015 at 7:27 AM, Richard Eisenberg <span dir="ltr"><<a href="mailto:eir@cis.upenn.edu" target="_blank">eir@cis.upenn.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">This is all expected behavior. GHC's lazy overlap checking for class instances simply cannot apply to type families -- it would be unsound. I'm afraid I don't see what can be improved here.<br>
<span><font color="#888888"><br>
Richard<br>
</font></span><div><div><br>
On Jun 6, 2015, at 2:04 AM, AntC <<a href="mailto:anthony_clayden@clear.net.nz" target="_blank">anthony_clayden@clear.net.nz</a>> wrote:<br>
<br>
>> From: AntC<br>
>> Date: 2015-06-04 22:39:25 GMT<br>
>><br>
>> Take the standard example for partial overlaps.<br>
>> Suppose I have a class: ...<br>
><br>
>> I'm also getting (in more complex examples)<br>
>> GHC complaining it can't infer the types<br>
>> for the result of f.<br>
>> So now I'm having to put type equality<br>
>> constraints on the class instances,<br>
>> to assure it that F comes up with<br>
>> the right type.<br>
><br>
> In a reduced example, I'm still getting<br>
> poor type checking. This is GHC 7.8.3.<br>
> This seems so dumb, I'm suspecting a defect,<br>
> It's similar to<br>
> but much more glaring than:<br>
> <a href="https://ghc.haskell.org/trac/ghc/ticket/10227" target="_blank">https://ghc.haskell.org/trac/ghc/ticket/10227</a><br>
> <a href="https://ghc.haskell.org/trac/ghc/ticket/9918" target="_blank">https://ghc.haskell.org/trac/ghc/ticket/9918</a><br>
><br>
> {-# LANGUAGE TypeFamilies,<br>
>             FlexibleInstances<br>
>   #-}<br>
> module ClosedTypeFamily where<br>
><br>
>    data Foo b c = Foo b c deriving (Eq, Read, Show)<br>
><br>
>    type family F a    where<br>
>      F (Foo Int c)  = Int        -- Foo Int is first instance<br>
>      F (Foo b Char) = Char<br>
><br>
>    class C a where f :: a -> F a<br>
><br>
>    instance C (Foo Int c) where  -- compiles OK<br>
>      f (Foo x _) = x<br>
><br>
>    instance (F (Foo b Char) ~ Char) => C (Foo b Char) where<br>
>      f (Foo _ y) = y<br>
><br>
> needs the eq constraint. Without it, GHC complains:<br>
>    Couldn't match expected type ‘F (Foo b Char)’<br>
>                with actual type ‘Char’<br>
>    Relevant bindings include<br>
>      f :: Foo b Char -> F (Foo b Char)<br>
>    In the expression: y<br>
>    In an equation for ‘f’: f (Foo _ y) = y<br>
><br>
> Note that if I change the sequence<br>
> of the family instances for F,<br>
> then GHC instead complains<br>
> about the class instance for (Foo Int c).<br>
><br>
> OK these are overlapping class instances.<br>
> But GHC's usual behaviour<br>
> (without closed type families)<br>
> is to postpone complaining<br>
> until and unless a usage<br>
> (Foo Int Char) actually turns up.<br>
><br>
> BTW if I put a first family instance<br>
>      F (Foo Int Char) = Int<br>
> to explicitly catch the overlap,<br>
> then GHC complains about **both** class instances.<br>
><br>
> Reminder [to Richard]<br>
> I need not only types but also terms.<br>
><br>
> AntC<br>
> _______________________________________________<br>
> Glasgow-haskell-users mailing list<br>
> <a href="mailto:Glasgow-haskell-users@haskell.org" target="_blank">Glasgow-haskell-users@haskell.org</a><br>
> <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/glasgow-haskell-users" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/glasgow-haskell-users</a><br>
><br>
<br>
_______________________________________________<br>
Glasgow-haskell-users mailing list<br>
<a href="mailto:Glasgow-haskell-users@haskell.org" target="_blank">Glasgow-haskell-users@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/glasgow-haskell-users" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/glasgow-haskell-users</a><br>
</div></div></blockquote></div><br></div>
</div></div><br>_______________________________________________<br>
Glasgow-haskell-users mailing list<br>
<a href="mailto:Glasgow-haskell-users@haskell.org">Glasgow-haskell-users@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/glasgow-haskell-users" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/glasgow-haskell-users</a><br>
<br></blockquote></div><br></div>