我想在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的新手。
答案 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
可能会派上用场。
对于Sum
,Prod
和Minus
,您需要递归计算每个操作数,然后对结果进行加/减/乘。例如,compute st (Sum (Val 3) (Val 5)) == compute st (Val 3) + compute st (Val 5)
。