2008-11-26 5 views

Répondre

1

Vous pouvez utiliser la technique décrite ici: http://augustss.blogspot.com/2007/04/overloading-haskell-numbers-part-2.html. Faites en sorte que votre type soit des classes de types nécassaires (Num, Fractionnel, Flottant) de sorte que -, +, * et ainsi de suite fonctionne pour votre type. Ensuite, si l'arbre d'expression est finalement construit, vous pouvez opérer dessus pour voir ce que vous pouvez simplifier.

3

Je ne suis pas sûr de ce que vous voulez dire, mais si vous avez un type de données d'expression, vous pouvez définir une fonction d'évaluation récursive. Dans ce cas, eval signifie simplifier.

Par exemple,

data Exp = Lit Int 
     | Plus Exp Exp 
     | Times Exp Exp 

eval :: Exp -> Int 
eval (Lit x)  = x 
eval (Plus x y) = eval x + eval y 
eval (Times x y) = eval x * eval y 

Il devient vraiment intéressant une fois que vous ajoutez des variables à la langue, mais c'est la forme la plus élémentaire d'une expression évaluateur.

0

Module Expr où

- Les variables sont nommées par des chaînes, supposées être des identificateurs. type Variable = Chaîne

- Représentation d'expressions. data Expr = Const Entier | Var Variable | Plus Expr Expr | Minus Expr Expr | Mult Expr Expr dériver (Eq, Show)

Simplifications tel que 0 * e = e * 0 = 0 et 1 * e = e * 1 = 0 + e = e + 0 = e-0 = e et simplifier les sous-expressions constantes, p.ex. Plus (Const 1) (Const 2) deviendrait Const 3. Je ne m'attendrais pas à ce que des variables (ou variables et constantes) soient concaténées: Var "st" est une variable distincte de Var "s".

ils ont besoin d'être écrit comme la suivante simplifier ((Const 0 Plus (Var'x '))) = Var "x"