HERMIT plugin for optimizing Scrap-Your-Boilerplate traversals.
|Latest on Hackage:||0.1.0.0|
This package is not currently in any snapshots. If you're interested in using it, we recommend adding it to Stackage Nightly. Doing so will make builds more reliable, and allow stackage.org to host generated Haddocks.
A HERMIT plugin for GHC which optimizes SYB generic traversals to achieve equivalent performance to hand-written traversals.
Details can be found in the paper: http://michaeldadams.org/papers/syb-opt/
Note: This compiler plugin requires GHC 7.8 (or HEAD) and specially compiled copies of base, ghc-prim, and syb. Up-to-date instructions can be found at: https://github.com/ku-fpg/hermit/wiki/GHC-HEAD. We are working to lift these requirements.
As an example, we apply the optimization to Foo.hs, which contains the following code:
module Main where import Data.Generics import HERMIT.Optimization.SYB.Prelude main :: IO () main = print (mapInt (+1) [1..10]) mapInt :: (Int -> Int) -> [Int] -> [Int] mapInt f = everywhere (mkT f)
Note that importing
HERMIT.Optimization.SYB.Prelude is required in any module targeted for optimization.
To compile Foo.hs with the optimization:
$ hermit Foo.hs -opt=HERMIT.Optimization.SYB +Main mapInt
This invokes GHC with a specific set of flags. These flags may be used instead of the
hermit program itself, or placed in a cabal file.
The first argument to HERMIT is the target file. Next is the -opt flag, which specifies the plugin name.
Then follows one or more target module names, each beginning with a plus sign. After each target module is a list of targeted functions.
interactive target will run the optimization on any other targets and then enter the HERMIT interactive shell.
interactive-only target will open the HERMIT shell before optimization.
HERMIT commands specific to this optimization are available for interactive use.