表示算术表达式

时间:2019-01-08 12:35:34

标签: haskell

我想在Haskell中计算一个包含字母和运算符的表达式。

我定义了一个代数类型Expr a来表示算术表达式:

data Expr a = Val a
    | Var [Char]
    | Sum (Expr a) (Expr a)
    | Prod (Expr a) (Expr a)
    | Minus (Expr a) (Expr a)

和操作

compute :: Num a => [(Char], a)] -> Expr a -> a

但是我不知道如何实现该功能,我是Haskell的新手。

1 个答案:

答案 0 :(得分:2)

给定一个符号表和一个语法树,您需要评估表达式。例如,

> compute [("foo", 5)] (Sum (Var "foo") (Val 3))
8

因为foo + 3 == 5 + 3 == 8

要编写此函数,您只需要处理compute可以接收的5种类型的表达式中的每一种:

compute :: Num a => [([Char], a)] -> Expr a -> a
compute st (Val x) = x
compute st (Var v) = ...
compute st (Sum x y) = ...
compute st (Prod x y) = ...
compute st (Minus x y) = ...

我以最简单的例子为例。 Val值的计算值只是它包装的a类型为compute [] (Val 3) == 3的值。

对于Var,您需要在符号表v中找到st,并返回其对应的值。预定义函数lookup将很有用。例如,compute [("foo", 5)] (Var "foo") == 5。您必须决定在compute [] (Var "foo")未定义foo的情况下该怎么做。函数maybe :: b -> (a -> b) -> Maybe a -> b可能会派上用场。

对于SumProdMinus,您需要递归计算每个操作数,然后对结果进行加/减/乘。例如,compute st (Sum (Val 3) (Val 5)) == compute st (Val 3) + compute st (Val 5)

相关问题