It doesn’t matter how beautiful your theory is, it doesn’t matter how smart you are. If it doesn’t agree with experiment, it’s wrong.
A typechecker plugin that can disambiguate “obvious” uses of effects in
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
Int to 10, which is clearly what’s meant.
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
but you just forgot to add a
Member constraint for it.”
This is obviously insane, but it’s the way the cookie crumbles.
polysemy-plugin is a typechecker plugin which will disambiguate the above
program (and others) so the compiler will do what you want.
Add the following line to your package configuration:
polysemy-plugin will only disambiguate effects if there is exactly one
relevant constraint in scope. For example, it will not disambiguate the
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
This plugin is copied almost verbatim from
Changelog for polysemy-plugin
- Fixed a bug where the plugin wouldn’t attempt to unify effects recursively
- Updated the test suite to test against
- Fixed a bug where the plugin would get confused in the context of legitimate type errors
- Fixed a serious bug where the changes from 0.1.0.1 broke most real-world usages of polysemy
- The plugin will now automatically perform the transformation in
inlineRecursiveCallswhen run with
- Added some explicit bounds for cabal
- Fixed a bug where effects that were too polymorphic would silently be accepted
- Initial release