It is possible to do this automatically, but you'll have to program
the automation yourself with Template Haskell.

2009/12/4 Radek Micek <[email protected]>:
> Hello.
>
> I have two types for expression:
>
> data Expr = Add Expr Expr | Mul Expr Expr | Const Int
>
> data AExpr = AAdd AExpr AExpr | AConst Int
>
> The first one supports addition and multiplication and the second
> only addition.
>
> I can write a function to simplify the first expression:
>
> simplify :: Expr -> Expr
> simplify = {- replaces:
> "a*1" and "1*a" by "a",
> "a+0" and "0+a" by a -}
>
> And I would like to use the function simplify for the second type
> AExpr. What can I do is to convert AExpr to Expr, simplify it and
> convert it back. But I don't like this solution because
> conversions take some time.
>
> I would prefer following: I say to the compiler that AAdd is like Add
> and AConst is like Const and the compiler derives function
> asimplify for AExpr.
>
> Is it possible to do this? In fact I want to have two distinct types
> where one is "extension" of the second (Expr is extension of AExpr)
> and I want to define a function for the extended type (Expr) and
> use it for the original type (AExpr). I assume that the function won't
> introduce Mul to the expression which had no Mul.
>
> Thanks in advance
>
> Radek Micek
> _______________________________________________
> Haskell-Cafe mailing list
> [email protected]
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>



-- 
Eugene Kirpichov
Web IR developer, market.yandex.ru
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to