2008-11-26 9 views
3

Consultez le code Haskell suivant:convertir une expression en une représentation de chaîne?

module Expr where 

    -- Variables are named by strings, assumed to be identifiers: 

    type Variable = String 

    -- Representation of expressions: 

    data Expr = Const Integer 
      | Var Variable 
      | Plus Expr Expr 
      | Minus Expr Expr 
      | Mult Expr Expr 
      deriving (Eq, Show) 


    simplify :: Expr->Expr 

    simplify (Mult (Const 0)(Var"x")) 
    = Const 0 
    simplify (Mult (Var "x") (Const 0)) 
    = Const 0 
    simplify (Plus (Const 0) (Var "x")) 
    = Var "x" 
    simplify (Plus (Var "x") (Const 0)) 
    = Var "x" 
    simplify (Mult (Const 1) (Var"x")) 
    = Var "x" 
    simplify (Mult(Var"x") (Const 1)) 
    = Var "x" 
    simplify (Minus (Var"x") (Const 0)) 
    = Var "x" 
    simplify (Plus (Const x) (Const y)) 
    = Const (x + y) 
    simplify (Minus (Const x) (Const y)) 
    = Const (x - y) 
    simplify (Mult (Const x) (Const y)) 
    = Const (x * y) 
    simplify x = x 

    toString :: Expr->String 

Comment puis-je convertir une expression à une représentation de chaîne?

par exemple.

toString (Var "x") = "x" 
toString (Plus (Var "x") (Const 1)) = "x + 1" 
toString (Mult (Plus (Var "x") (Const 1)) (Var "y")) 
     = "(x + 1) * y" 

Répondre

1

Il semble que vous avez presque cela.

Voici un exemple

toString (Plus e1 e2) = (toString e1) ++ " + " ++ (toString e2) 
toString (Const i) = show i 
3

Plutôt que d'appeler votre fonction toString, il pourrait être préférable d'utiliser la Show type class. Ensuite, votre type de données peut être utilisé n'importe où qu'une instance de Show peut être utilisée. Show est la manière standard de Haskell de convertir des "choses" en chaînes.

instance Show Expr where 
    show (Var "x") = "x" 
    -- etc. 
Questions connexes