Safe Haskell | None |
---|---|
Language | Haskell2010 |
A typechecker plugin that can disambiguate "obvious" uses of effects in Polysemy.
Example:
Consider the following program:
foo ::Member
(State
Int) r =>Sem
r () foo =put
10
What does this program do? Any human will tell you that it changes the state
of the Int
to 10, which is clearly what's meant.
Unfortunately, Polysemy can't work this out on its own. Its reasoning is
"maybe you wanted to change some other State
effect which
is also a Num
, but you just forgot to add a Member
constraint
for it."
This is obviously insane, but it's the way the cookie crumbles.
Plugin
is a typechecker plugin which will disambiguate the above
program (and others) so the compiler will do what you want.
Usage:
Add the following line to your package configuration:
ghc-options: -fplugin=Polysemy.Plugin
Limitations:
The Plugin
will only disambiguate effects if there is exactly one
relevant constraint in scope. For example, it will not disambiguate the
following program:
bar ::Members
'[State
Int ,State
Double ] r =>Sem
r () bar =put
10
because it is now unclear whether you're attempting to set the Int
or the
Double
. Instead, you can manually write a type application in this case.
bar ::Members
'[State
Int ,State
Double ] r =>Sem
r () bar =put
@Int 10