Reprezentace aritmetickeho vyrazu uzivatelskym datovym typem

> data Expr = Num Int
>           | Add Expr Expr
>           | Sub Expr Expr
>           | Mul Expr Expr
>           | Div Expr Expr
>           | Var Char
>             deriving (Eq)

Vyhodnoceni vyrazu ve stromove reprezentaci

> eval :: Expr -> Int
> eval (Num x) = x
> eval (Add e1 e2) = (eval e1) + (eval e2)
> eval (Sub e1 e2) = (eval e1) - (eval e2)
> eval (Mul e1 e2) = (eval e1) * (eval e2)
> eval (Div e1 e2) = let y = eval e2 in
>                    if y == 0 then error "Deleni nulou"
>                              else (eval e1) `div` y

Prevod vyrazu ve stromove reprezentaci na retezec

> showExpr :: Expr -> String
> showExpr e = she 0 e
>    where she _ (Num x) = show x
>          she _ (Var x) = show x
>          she p (Add e1 e2) = she' p 1 " + " e1 e2
>          she p (Sub e1 e2) = she' p 1 " - " e1 e2
>          she p (Mul e1 e2) = she' p 2 " * " e1 e2
>          she p (Div e1 e2) = she' p 2 " / " e1 e2
>          she' p pop op e1 e2 = let s = she pop e1 ++ op ++ she pop e2
>                                in if pop > p then s
>                                   else "("++s++")"


Priklady vyrazu:

> ex1, ex2, ex3:: Expr
> ex1 = Add (Mul (Num 2) (Num 3)) (Num 5)  -- 2 * 3 + 5
> ex2 = Add (Num 2) (Mul (Num 3) (Num 5))  -- 2 + 3 * 5
> ex3 = Mul (Add (Num 2) (Num 3)) (Num 5)  -- (2 + 3) * 5
> ex4 = Add (Add (Num 2) (Num 3)) (Num 5)  -- 2 + 3 + 5
> ex5 = Add (Num 2) (Add (Num 3) (Num 5))  --  2 + (3 + 5)
> ex6 = Div (Num 5) (Sub (Num 3) (Num 3))  -- 5 / (3 - 3) = error