考虑以下Haskell代码:
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
如何将表达式转换为字符串表示形式?
e.g。
toString (Var "x") = "x"
toString (Plus (Var "x") (Const 1)) = "x + 1"
toString (Mult (Plus (Var "x") (Const 1)) (Var "y"))
= "(x + 1) * y"
答案 0 :(得分:3)
不是将函数调用toString,而是最好使用Show type class。然后,您可以在任何可以使用Show实例的地方使用您的数据类型。 Show是将“事物”转换为字符串的标准Haskell方式。
instance Show Expr where
show (Var "x") = "x"
-- etc.
答案 1 :(得分:1)
看起来你几乎拥有它。
这是一个例子
toString (Plus e1 e2) = (toString e1) ++ " + " ++ (toString e2)
toString (Const i) = show i
答案 2 :(得分:0)