bound
Making de Bruijn Succ Less
http://github.com/ekmett/bound/
| Version on this page: | 2.0.7 | 
| LTS Haskell 24.18: | 2.0.7@rev:2 | 
| Stackage Nightly 2025-11-04: | 2.0.7@rev:2 | 
| Latest on Hackage: | 2.0.7@rev:2 | 
BSD-3-Clause licensed by Edward A. Kmett
Maintained by Edward A. Kmett
This version can be pinned in stack with:
bound-2.0.7@sha256:ca9f8248d42b0873469f5726e2eb892914ca7165dc5dc8fbe039abc8ca712116,4284Module documentation for 2.0.7
Depends on 14 packages(full list with versions):
Bound
Goals
This library provides convenient combinators for working with “locally-nameless” terms. These can be useful when writing a type checker, evaluator, 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.
See the documentation on hackage for more information, but here is an example:
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveFoldable #-}
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE TemplateHaskell #-}
import Bound
import Control.Applicative
import Control.Monad
import Data.Functor.Classes
import Data.Foldable
import Data.Traversable
import Data.Eq.Deriving (deriveEq1)      -- these two are from the
import Text.Show.Deriving (deriveShow1)  -- deriving-compat package
infixl 9 :@
data Exp a = V a | Exp a :@ Exp a | Lam (Scope () Exp a)
  deriving (Eq,Show,Functor,Foldable,Traversable)
instance Applicative Exp where pure = V; (<*>) = ap
instance Monad Exp where
  return = V
  V a      >>= f = f a
  (x :@ y) >>= f = (x >>= f) :@ (y >>= f)
  Lam e    >>= f = Lam (e >>>= f)
lam :: Eq a => a -> Exp a -> Exp a
lam v b = Lam (abstract1 v b)
whnf :: Exp a -> Exp a
whnf (f :@ a) = case whnf f of
  Lam b -> whnf (instantiate1 a b)
  f'    -> f' :@ a
whnf e = e
deriveEq1 ''Exp
deriveShow1 ''Exp
main :: IO ()
main = do
  let term = lam 'x' (V 'x') :@ V 'y'
  print term         -- Lam (Scope (V (B ()))) :@ V 'y'
  print $ whnf term  -- V 'y'
There are longer examples in the examples/ folder.
Contact Information
Contributions and bug reports are welcome!
Please feel free to contact me through github or on the #haskell IRC channel on irc.freenode.net.
-Edward Kmett
Changes
2.0.7 [2023.08.06]
- Support building with 
template-haskell-2.21.*(GHC 9.8). 
2.0.6 [2023.01.18]
- Allow the examples to build with 
base-4.18.*(GHC 9.6). 
2.0.5 [2022.05.07]
- Allow building with 
transformers-0.6.*. 
2.0.4 [2021.11.07]
- Allow building with 
template-haskell-2.18(GHC 9.2). - The 
Bound.THmodule no longer requires theTemplateHaskellextension (onlyTemplateHaskellQuotes) when building with GHC 9.0 or later. - Drop support for pre-8.0 versions of GHC.
 
2.0.3 [2021.02.05]
- Allow the examples to build with 
vector-0.12.2or later. - The build-type has been changed from 
CustomtoSimple. To achieve this, thedocteststest suite has been removed in favor of usingcabal-docspecto run the doctests. 
2.0.2 [2020.10.01]
- Allow building with GHC 9.0.
 
2.0.1
- Add 
abstractEitherandinstantiateEithertoBound.Scope, and addabstractEitherNameandinstantiateEitherNametoBound.Scope.Name - Add 
Generic(1)instances forNameandScope - Support 
doctest-0.12 
2
- GHC 8.0 and 8.2 support
 - Converted from 
prelude-extrastotransformers+transformers-compatfor theEq1,Ord1,Show1, andRead1functionality. makeBoundsupportsFunctorcomponents- Add 
MFunctorinstance forScope - Add 
NFDatainstances forName,Scope, andVar - Revamp 
Setup.hsto usecabal-doctest. This makes it build withCabal-1.25, and makes thedoctests work withcabal new-buildand sandboxes. 
1.0.7
- Added an 
-f-template-haskelloption to allow disablingtemplate-haskellsupport. This is an unsupported configuration but may be useful for expert users in sandbox configurations. - Support 
cereal0.5 
1.0.6
- Compiles warning-free on GHC 7.10
 
1.0.5
- Widened version bound on 
bifunctors. - Widened version bound on 
profunctors. 
1.0.4
- Widened version bound on 
transformers. 
1.0.3
- Added 
bitransverseScope. 
1.0.2
- Removed unneccesary constraint on 
hoistScope. 
1.0.1
- Added a monomorphic 
hoistScopeforBound.Scope.Simple 
1.0
- Added instances for 
Boundfor all of themtlmonads. - Added 
DataandTypeablesupport to both versions ofScope - Added the missing 
Applictiveinstance toBound.Scope.Simple - Moved 
hoistScope,bitraverseScope,transverseScope, andinstantiateVarshere from theerminecompiler. 
0.9.1.1
- Updated to work with 
bifunctors4.0 
0.9.1
- Updated to work with 
comonad4.0 andprofunctors4.0 
0.9
- Added the missing instance for 
Applicative (Scope b f) 
0.8.1
- SafeHaskell support
 
0.8
- Added 
Serial,BinaryandSerializeinstances forScope. 
0.7
- Added 
Hashable,Hashable1andHashable2instances where appropriate forName,VarandScope. 
0.6.1
- More aggressive inlining
 - Added 
unvar,_B,_FtoBound.Var. - Added 
_NametoBound.Name. 
0.6
- Support for 
prelude-extras0.3 
0.5.1
- Removed my personal inter-package dependency upper bounds
 - Updated doctest suite to use exact versions.
 
0.5
- Created a 
doctest-based test suite - Added many examples
 - 100% haddock coverage
 - Added the 
NameComonad, to help retain names for bound variables. - Bumped dependencies