Skip to content

Fix "Could not deduce: effs ~ (r : rs)" errors

Commit 42604669 added the "r has at least two elements" constraint to the Member' t r ('S n) instance but Member t effs with a general (unknown) effs isn't enough to deduce that effs is non-empty, so this doesn't typecheck:

f :: Eff (IO ': effs) () -> Eff effs ()
f = undefined

g :: (Member Maybe effs) => Eff effs ()
g = undefined

h :: (Member Maybe effs) => Eff effs ()
h = f g

GHC complains that it could not deduce: effs ~ (r : rs) arising from the use of g. It can be worked around by using this instead:

h :: (Member Maybe (e ': es)) => Eff (e ': es) ()
h = f g

but I don't think this is a good user experience, and it's a regression from 0.2.3.0 that would normally require a major version bump to 0.3 as it breaks existing code. Therefore a fix should go in quickly and should get into lts-7 asap.

This commit adds the "effs is non-empty" constraint to Member t effs so the above typechecks again.

Merge request reports