polysemy-plugin: Disambiguate obvious uses of effects.

[ bsd3, library, polysemy ] [ Propose Tags ]

Please see the README on GitHub at https://github.com/isovector/polysemy/tree/master/polysemy-plugin#readme


[Skip to Readme]
Versions [faq] 0.1.0.0, 0.1.0.1, 0.2.0.0, 0.2.0.1, 0.2.0.2, 0.2.0.3, 0.2.1.0 (info)
Change log ChangeLog.md
Dependencies base (>=4.7 && <5), containers (>=0.6 && <=0.7), ghc (>=8.6.3 && <8.7), ghc-tcplugins-extra (==0.3.*), polysemy (>=0.1), syb (==0.7.*), transformers (>=0.5.5.0 && <0.6) [details]
License BSD-3-Clause
Copyright 2019 Sandy Maguire
Author Sandy Maguire
Maintainer sandy@sandymaguire.me
Category Polysemy
Home page https://github.com/isovector/polysemy#readme
Bug tracker https://github.com/isovector/polysemy/issues
Source repo head: git clone https://github.com/isovector/polysemy
Uploaded by isovector at Fri Jun 14 15:39:05 UTC 2019
Distributions NixOS:0.2.0.3, Stackage:0.2.1.0
Downloads 273 total (217 in the last 30 days)
Rating (no votes yet) [estimated by rule of succession]
Your Rating
  • λ
  • λ
  • λ
Status Hackage Matrix CI
Docs uploaded by user
Build status unknown [no reports yet]

Modules

[Index] [Quick Jump]

Downloads

Maintainer's Corner

For package maintainers and hackage trustees


Readme for polysemy-plugin-0.2.1.0

[back to package description]

polysemy-plugin

Build Status Hackage

Dedication

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

Overview

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

Acknowledgments

This plugin is copied almost verbatim from simple-effects.