in-other-words-plugin: Disambiguate obvious uses of effects when using in-other-words.

This is a package candidate release! Here you can preview how this package release will appear once published to the main package index (which can be accomplished via the 'maintain' link below). Please note that once a package has been published to the main package index it cannot be undone! Please consult the package uploading documentation for more information.

[maintain] [Publish]

Please see the README on GitHub at https://github.com/KingoftheHomeless/in-other-words-plugin#readme


[Skip to Readme]

Properties

Versions 0.1.0.0, 0.1.0.0
Change log ChangeLog.md
Dependencies base (>=4.9 && <5), containers (>=0.5 && <0.7), ghc (>=8.4.4 && <9), ghc-tcplugins-extra (>=0.3 && <0.5), in-other-words (>=0.1 && <0.3), syb (>=0.7 && <0.8), transformers (>=0.5.2.0 && <0.6) [details]
License BSD-3-Clause
Copyright 2021 Love Waern
Author Love Waern
Maintainer combiner8761@gmail.com
Category Control Language
Home page https://github.com/KingoftheHomeless/in-other-words-plugin#readme
Bug tracker https://github.com/KingoftheHomeless/in-other-words-plugin/issues
Source repo head: git clone https://github.com/KingoftheHomeless/in-other-words-plugin
Uploaded by KingoftheHomeless at 2021-01-30T18:25:01Z

Modules

[Index] [Quick Jump]

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees


Readme for in-other-words-plugin-0.1.0.0

[back to package description]

in-other-words-plugin

build GHC 8.6 build GHC 8.8 build GHC 8.10

Overview

A typechecker plugin that can disambiguate "obvious" uses of effects when using in-other-words.

Example

Consider the following program:

foo :: Eff (State Int) m => m ()
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, in-other-words 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 some Eff/s constraints for it."

This is obviously insane, but it's the way the cookie crumbles. in-other-words-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=Control.Effect.Plugin

Limitations

in-other-words-plugin will only disambiguate effects if there is exactly one relevant constraint in scope. For example, it will not disambiguate the following program:

bar :: Effs '[ State Int
             , State Double
             ] m
    => m ()
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 :: Effs '[ State Int
             , State Double
             ] m
    => m ()
bar = put @Int 10

Acknowledgments

This plugin and this README is copied almost verbatim from polysemy-plugin, which itself is copied almost verbatim from simple-effects.