<div dir="ltr"><div>For the third case, the GHC manual says -XTypeApplications:</div><div><br></div><div>> can be used whenever
the full polymorphic type of the function is known. If the function
is an identifier (the common case), its type is considered known only when
the identifier has been given a type signature. If the identifier does
not have a type signature, visible type application cannot be used.</div><div><br></div><div>So it works if x has a type signature:<br></div><div><br></div><div>x :: C m => () -> m<br></div><div>x u = c u</div><div>g = (x @Int (), x @Bool ())</div><div><br></div><div>I think 'g' should work without the type signature on 'x'. Inferred type variables may switch places between ghc versions. So "h" below might change between (Int,Bool) and (Bool,Int). So they reject "h". But for 'g' there's only one ordering.<br></div><div><br></div><div>h = (x (), x ()) @Int @Bool</div><div><br></div><div>The error "Cannot apply expression of type _ to a visible type argument _ in the expression: x ..." might be clearer if it also had "Possible fix: add a type signature to the declaration/binding of x"<br></div><div><br></div><div>Regards,<br></div><div>Adam<br></div><div><br></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Mar 29, 2022 at 11:40 AM Oleg Grenrus <<a href="mailto:oleg.grenrus@iki.fi">oleg.grenrus@iki.fi</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">First example doesn't work due MonomorphismRestriction.<br>
Second one works because it's all Haskell98 (to first approximation: it<br>
must work).<br>
Third one is interesting. At first I didn't expect it work, but given a<br>
bit of thought, I wasn't tht sure anymore: I don't know why `x` isn't<br>
already generalized when type-checking body of the let-in.<br>
<br>
- Oleg<br>
<br>
On 28.3.2022 17.14, Georgi Lyubenov wrote:<br>
> Dear Cafe,<br>
><br>
> I recently came upon this little "type-inference puzzle". Can anyone<br>
> shine some light on why the third example doesn't compile?<br>
><br>
> ```<br>
> {-# LANGUAGE TypeApplications #-}<br>
> -- doesn't work<br>
> -- I expect this, not sure why it happens<br>
> {-<br>
> class C m where<br>
>   c :: () -> m<br>
><br>
> instance C Int where<br>
>   c () = 0<br>
><br>
> instance C Bool where<br>
>   c () = False<br>
><br>
> f :: (Int, Bool)<br>
> f =<br>
>   let x = c<br>
>    in<br>
>    (x (), x ())<br>
> -}<br>
><br>
> -- works<br>
> -- I expect this, not sure why it happens<br>
> {-<br>
> class C m where<br>
>   c :: () -> m<br>
><br>
> instance C Int where<br>
>   c () = 0<br>
><br>
> instance C Bool where<br>
>   c () = False<br>
><br>
> f :: (Int, Bool)<br>
> f =<br>
>   let x u = c u<br>
>    in<br>
>    (x (), x ())<br>
> -}<br>
><br>
> -- doesn't work<br>
> -- I don't expect this, not sure why it happens<br>
> {-<br>
> class C m where<br>
>   c :: () -> m<br>
><br>
> instance C Int where<br>
>   c () = 0<br>
><br>
> instance C Bool where<br>
>   c () = False<br>
><br>
> f :: (Int, Bool)<br>
> f =<br>
>   let x u = c u<br>
>    in<br>
>    (x @Int (), x @Bool ())<br>
> -- wtf.hs:54:5: error:<br>
> --     • Cannot apply expression of type ‘() -> m0’<br>
> --       to a visible type argument ‘Int’<br>
> --     • In the expression: x @Int ()<br>
> --       In the expression: (x @Int (), x @Bool ())<br>
> --       In the expression: let x u = c u in (x @Int (), x @Bool ())<br>
> --    |<br>
> -- 54 |    (x @Int (), x @Bool ())<br>
> --    |     ^^^^^^^^^<br>
> -}<br>
> ```<br>
><br>
> Cheers,<br>
> Georgi<br>
><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.<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>