[Haskell-cafe] Haskell-Cafe Digest, Vol 141, Issue 25

Michael Baikov manpacket at gmail.com
Sun May 17 01:38:17 UTC 2015


>
> Suppose the following data type for encoding Boolean expressions:
>
> data BExpr  a = BTrue
>               | BFalse
>               | Id String
>               | Not a
>               | And a a
>               | Or  a a
>               | BEq a a
>           deriving (Functor)
> type Expr = Fix BExpr
>
> It is easy to produce a string representation of an expression or evaluate
> it:
>
> estr :: BExpr String -> String
> eval :: BExpr Bool  -> Bool
>
> with the cata function from Data.Functor.Fixedpoint.
>
> Could you suggest a solution for transforming trees encoded as Exp into
> equivalent Expr (e.g Not Not a ~> a)?
> cata does not work since it expects a function f a -> a while a
> transformation would be f a -> f a.

Actually cata works just fine, all you need following transformation
which is f a -> a

alg :: BExpr Expr -> Expr
alg (Not (Fix (Not a))) = a
alg x = Fix x


More information about the Haskell-Cafe mailing list