<div dir="ltr">This works if you enable NoMonomorphismRestriction.<div><br></div><div>Cheers,</div><div>Adam</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr">On Thu, 22 Feb 2018 at 23:41 Tom Ellis <<a href="mailto:tom-lists-haskell-cafe-2013@jaguarpaw.co.uk">tom-lists-haskell-cafe-2013@jaguarpaw.co.uk</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I'm puzzled by GHC's behaviour in the following program.<br>
<br>
'baz = bar . foo' does not work because there is "no instance for ...".  But<br>
if I manually assume those instances in the context all is fine.  Why can<br>
GHC not infer that context?  Is there any extension or clever trick I can<br>
use to get this to infer like I want?<br>
<br>
Thanks,<br>
<br>
Tom<br>
<br>
<br>
<br>
{-# LANGUAGE MultiParamTypeClasses #-}<br>
{-# LANGUAGE TypeFamilies #-}<br>
{-# LANGUAGE FlexibleContexts #-}<br>
<br>
class Foo a b<br>
class Bar a b<br>
type family Quux a<br>
<br>
foo :: ( Foo a b<br>
       , b ~ Quux a )<br>
    => a<br>
    -> Quux a<br>
foo = undefined<br>
<br>
bar :: Bar a b<br>
    => a<br>
    -> b<br>
bar = undefined<br>
<br>
-- Doesn't work<br>
-- No instance for (Bar (Quux a0) c0) arising from a use of ‘bar’<br>
-- No instance for (Foo a0 (Quux a0)) arising from a use of ‘foo’<br>
--baz = bar . foo<br>
<br>
baz' :: ( Foo a (Quux a)<br>
        , Bar (Quux a) b )<br>
     => a<br>
     -> b<br>
baz' = bar . foo<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
Only members subscribed via the mailman list are allowed to post.</blockquote></div>