преобразовать выражение в строковое представление? - PullRequest
3 голосов
/ 26 ноября 2008

Рассмотрим следующий код на 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

Как я могу преобразовать выражение в строковое представление?

, например

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

Ответы [ 3 ]

3 голосов
/ 27 ноября 2008

Вместо вызова вашей функции toString может быть предпочтительнее использовать класс Show type . Тогда ваш тип данных может использоваться везде, где может использоваться экземпляр Show. Show - это стандартный способ преобразования «вещей» в строки в Haskell.

instance Show Expr where
    show (Var "x") = "x"
    -- etc.
1 голос
/ 26 ноября 2008

Похоже, у вас это почти есть.

Вот пример

toString (Plus e1 e2) = (toString e1) ++ " + " ++ (toString e2)
toString (Const i) = show i
0 голосов
/ 26 ноября 2008

Вот все, что вам нужно знать для этого: http://augustss.blogspot.com/2007/04/overloading-haskell-numbers-part-1.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...