The bound package

We represent the target language itself as an ideal monad supplied by the
user, and provide a Scope monad transformer for introducing bound variables
in user supplied terms. Users supply a Monad and Traversable instance,
and we traverse to find free variables, and use the Monad to perform
substitution that avoids bound variables.

Slides describing and motivating this approach to name binding are available
online at:

The goal of this package is to make it as easy as possible to deal with name
binding without forcing an awkward monadic style on the user.

With generalized de Bruijn term you can lift whole trees instead of just
applying succ to individual variables, weakening the all variables bound
by a scope and greatly speeding up instantiation. By giving binders more
structure we permit easy simultaneous substitution and further speed up
instantiation.

Downloads

Maintainer's Corner

Readme for bound

Readme for bound-0.5.0.1

Bound

Goals

This library provides convenient combinators for working with "locally-nameless" terms. These can be useful
when writing a type checker, evalator, parser, or pretty printer for terms that contain binders like forall
or lambda, as they ease the task of avoiding variable capture and testing for alpha-equivalence.