th-alpha-0.1.0.0: Alpha equivalence for TH Dec and Exp

Stabilityexperimental
Maintainerjkarni@gmail.com
Safe HaskellNone

Language.Haskell.TH.Alpha

Description

Compare TH expressions (or clauses, patterns, etc.) for alpha equivalence. That is, compare for equality modulo the renaming of bound variables.

>>> areExpEq [| \x -> x |] [| \y -> y |]
True

This can be useful when for instance testing libraries that use Template Haskell: usually correctness is only defined up to alpha equivalence.

N.B.: This package doesn't yet handle type annotations correctly!

Synopsis

Documentation

class AlphaEq a whereSource

The main Alpha Equivalence class. @= is by default defined in terms of lkEq. lkEq is exposed for composability: it is easy to recursively build AlphaEq instances from other AlphaEq instances by delegating the lookup update to the subinstances.

Methods

(@=) :: a -> a -> BoolSource

Compares its arguments for alpha equivalence.

lkEq :: a -> a -> Lookup -> Maybe LookupSource

Given a variable binding lookup compares arguments for alpha equivalence, returning Just of updated lookup in case of equivalence, Nothing otherwise.

exp_equal :: Quasi m => Exp -> Exp -> m BoolSource

Compare two expressions for alpha-equivalence. Since this uses th-desugar to desugar the expressions, returns a Bool in the Quasi context.