HERMIT plugin for optimizing Scrap-Your-Boilerplate traversals.

Latest on Hackage:

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.

BSD3 licensed by Michael D. Adams and Andrew Farmer
Maintained by Andrew Farmer

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. The distinguished interactive target will run the optimization on any other targets and then enter the HERMIT interactive shell. The distinguished interactive-only target will open the HERMIT shell before optimization. HERMIT commands specific to this optimization are available for interactive use.

comments powered byDisqus