"Provide warnings for unexpected Core generation"
Please see the README on GitHub at https://github.com/JonathanLorimer/core-warn#readme
Core Warn
Motivation
This plugin was inspired by these two blog posts from Well Typed: part 1, part 2. They discuss two scenarios where GHC's core representation deviates drastically from what one might expect. These phenomena can be grouped into two buckets: instances where GHC produces too many unnecessary type coercions, and instances where GHC produces large chains of dictionary references. The first can be solved by ensuring that all expensive instances occur in a phantom context, and the second can be solved by ensuring that all inductive instances are balanced.
Usage
Stack
In your stack.yaml
add this
extra-deps:
- core-warn-0.1.0.0
and then in package.yaml
add:
dependencies:
- core-warn
ghc-options:
- -fplugin=CoreWarn
Cabal
Add these lines to the corresponding stanza of your cabal file. For example if you want to run CoreWarn
on your library stanza, add the below code block as a child of library
.
ghc-options: -fplugin=CoreWarn
build-depends: base >=4.10 && <5
, ...
, core-warn
or you can run this option from the command line for a specific component, in this example we chose the test
component:
$ cabal repl test --ghc-options=-fplugin=CoreWarn
Options
Here is an example of how you would apply an option to this plugin. For the sake of variety we will use a file level pragma as the example.
{-# OPTIONS_GHC -fplugin-opt=CoreWarn:<opt-name> #-}
The plugin accepts four arguments, but by default opts in. For example if you wanted to only show warning for one kind of issue mentioned above, you could use the follwing options:
warn-large-coercions
warn-deep-dicts
If you have CoreWarn
enabled for the entire project, you might want to disable it in a particular file. You can do so with the following options:
no-warn-large-coercions
no-warn-deep-dicts
.