Skip to content
Branch: master
Find file History
isovector Remove Effect class (#118)
This thing was a vestige of the bad old days when you had to write
*instances* of classes things in Polysemy. It was a terrible experience,
and so we don't do that anymore. As a result, the only two instances of
`Effect` were for `Union` and `Yo` --- so I just inlined them.
Latest commit 6ffb4fd Jun 17, 2019


Build Status Hackage


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.

Richard Feynman


A typechecker plugin that can disambiguate "obvious" uses of effects in polysemy.


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. 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:

ghc-options: -fplugin=Polysemy.Plugin


The polysemy-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


This plugin is copied almost verbatim from simple-effects.

You can’t perform that action at this time.