hegg-0.3.0.0: src/Data/Equality/Language.hs
{-# LANGUAGE FlexibleContexts #-}
{-|
Defines 'Language', which is the required constraint on /expressions/ that are
to be represented in e-graph and on which equality saturation can be run.
=== Example
@
data Expr a = Sym String
| Const Double
| UnOp UOp a
| BinOp BOp a a
deriving ( Eq, Ord, Functor
, Foldable, Traversable)
instance Eq1 Expr where
...
instance Ord1 Expr where
...
instance Analysis Expr where
...
-- meaning we satisfy all other constraints and Expr is! a language
instance Language Expr
@
-}
module Data.Equality.Language where
import Data.Functor.Classes
-- | A 'Language' is the required constraint on /expressions/ that are to be
-- represented in an e-graph.
--
-- Recursive data types must be expressed in its functor form to instance
-- 'Language'. Additionally, for a datatype to be a 'Language' (used in
-- e-graphs), note that it must satisfy the other class constraints. In
-- particular an 'Data.Equality.Analysis.Analysis' must be defined for the
-- language.
class (Traversable l, Ord1 l) => Language l where