
First example doesn't work due MonomorphismRestriction. Second one works because it's all Haskell98 (to first approximation: it must work). Third one is interesting. At first I didn't expect it work, but given a bit of thought, I wasn't tht sure anymore: I don't know why `x` isn't already generalized when type-checking body of the let-in. - Oleg On 28.3.2022 17.14, Georgi Lyubenov wrote:
Dear Cafe,
I recently came upon this little "type-inference puzzle". Can anyone shine some light on why the third example doesn't compile?
``` {-# LANGUAGE TypeApplications #-} -- doesn't work -- I expect this, not sure why it happens {- class C m where c :: () -> m
instance C Int where c () = 0
instance C Bool where c () = False
f :: (Int, Bool) f = let x = c in (x (), x ()) -}
-- works -- I expect this, not sure why it happens {- class C m where c :: () -> m
instance C Int where c () = 0
instance C Bool where c () = False
f :: (Int, Bool) f = let x u = c u in (x (), x ()) -}
-- doesn't work -- I don't expect this, not sure why it happens {- class C m where c :: () -> m
instance C Int where c () = 0
instance C Bool where c () = False
f :: (Int, Bool) f = let x u = c u in (x @Int (), x @Bool ()) -- wtf.hs:54:5: error: -- • Cannot apply expression of type ‘() -> m0’ -- to a visible type argument ‘Int’ -- • In the expression: x @Int () -- In the expression: (x @Int (), x @Bool ()) -- In the expression: let x u = c u in (x @Int (), x @Bool ()) -- | -- 54 | (x @Int (), x @Bool ()) -- | ^^^^^^^^^ -} ```
Cheers, Georgi
_______________________________________________ Haskell-Cafe mailing list To (un)subscribe, modify options or view archives go to: http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe Only members subscribed via the mailman list are allowed to post.