Copyright | (c) Julian K. Arni, 2014 |
---|---|
License | BSD3 |
Maintainer | jkarni@gmail.com |
Stability | experimental |
Safe Haskell | None |
Language | Haskell2010 |
Compare TH expressions (or clauses, patterns, etc.) for alpha equivalence. That is, compare for equality modulo the renaming of bound variables.
>>>
areExpAEq [| \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.
For most cases, areExpAEq
is the only function you'll need. The AlphaEq
class is only exported to make it easier to expand alpha-equality
comparison to other instances, or to be used (in combination with the
package th-desugar) for alpha equality comparisons of non-expression
types (e.g. TyVarBndr).
N.B.: This package doesn't yet handle type annotations correctly!
Documentation
(@=) :: (Monad m, AlphaEq a m) => a -> a -> m Bool infix 4 Source
Compares its arguments for alpha equivalence. The default implementation uses Lookup for its LookupTbl, but more efficient datatypes can be used.
class AlphaEq a m | a -> m where Source
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.