@hackage / effectful-plugin

A GHC plugin for improving disambiguation of effects.

Latest2.1.0.0

About

Metadata

  • Last updated , by arybczak
  • License BSD-3-Clause
  • Maintained by: andrzej@rybczak.net

  • Lottery factor: 1

Links

Installation

Tested Compilers

  1. 9.10.3
  2. 9.8.4
  3. 9.6.7

Package Flags

Use the -f option with cabal commands to enable flags

    timing (off by default)

    Show timing information

    verbose (off by default)

    Trace plugin execution

Readme

effectful-plugin

A GHC plugin for improving disambiguation of effects.

Usage

To enable the plugin, add the following GHC option to your project file:

ghc-options: -fplugin=Effectful.Plugin

What it does

The following code:

action :: (State Int :> es, State String :> es) => Eff es ()
action = do
  x <- get
  put (x + 1)

will not compile out of the box because GHC doesn't know that you meant to get an Int since the function + as well as the literal 1 are polymorphic. You have to write:

action :: (State Int :> es, State String :> es) => Eff es ()
action = do
  x <- get @Int
  put (x + 1)

Which is slightly annoying. This plugin tells GHC extra information so code like this can type-check without having to spell types to the compiler.

Acknowledgements

Thanks to Xy Ren for her work on cleff-plugin effectful-plugin is based on.