| ||||||||
| ||||||||
Description | ||||||||
By importing this module, the user is able to use all the rewriting machinery. The user is only required to provide an instance of Regular and Rewrite for the datatype. Consider a datatype representing logical propositions: data Expr = Const Int | Expr :++: Expr | Expr :**: Expr deriving Show infixr 5 :++: infixr 6 :**: An instance of Regular would look like: data Const data Plus data Times instance Constructor Const where conName _ = "Const" instance Constructor Plus where conName _ = "(:++:)" conFixity _ = Infix RightAssociative 5 instance Constructor Times where conName _ = "(:**:)" conFixity _ = Infix RightAssociative 6 type instance PF Expr = C Const (K Int) :+: C Plus (I :*: I) :+: C Times (I :*: I) instance Regular Expr where from (Const n) = L (C (K n)) from (e1 :++: e2) = R (L (C $ (I e1) :*: (I e2))) from (e1 :**: e2) = R (R (C $ (I e1) :*: (I e2))) to (L (C (K n))) = Const n to (R (L (C ((I r1) :*: (I r2))))) = r1 :++: r2 to (R (R (C ((I r1) :*: (I r2))))) = r1 :**: r2 Alternatively, the above code could be derived using Template Haskell: $(deriveConstructors ''Expr) $(deriveRegular ''Expr "PFExpr") type instance PF Expr = PFExpr Additionally, the instance Rewrite would look like: instance Rewrite Expr Rules are built like this: rule1 :: Rule Expr rule1 = rule $ \x -> x :++: Const 0 :~> x rule5 :: Rule Expr rule5 = rule $ \x y z -> x :**: (y :++: z) :~> (x :**: y) :++: (x :**: z) And applied as follows: test1 :: Maybe Expr test1 = rewriteM rule1 (Const 2 :++: Const 0) test10 :: Maybe Expr test10 = rewriteM rule5 ((Const 1) :**: ((Const 2) :++: (Const 3))) | ||||||||
Documentation | ||||||||
module Generics.Regular.Base | ||||||||
module Generics.Regular.Functions | ||||||||
module Generics.Regular.Rewriting.Machinery | ||||||||
module Generics.Regular.Rewriting.Rules | ||||||||
module Generics.Regular.Rewriting.Strategies | ||||||||
Produced by Haddock version 2.4.2 |