使用Haskell的简单解释器

时间:2014-11-09 06:05:48

标签: haskell interpreter abstract-syntax-tree

我还在学习Haskell,这个问题看起来非常基本,但它已经让我筋疲力尽了一段时间。

鉴于以下内容

data Term =
    Number Integer
  | Abs Term
  | Plus Term Term
  | Mult Term Term
  deriving (Eq, Show)

我想创建一个解释器,如果我打电话,例如,

evaluate (Plus (Number 10) (Number 10))

它将返回20.以下是我到目前为止

myabsolute :: Integer -> Integer
myabsolute n = if n >= 0 then n else -n

evaluate :: Term -> Integer
evaluate Plus = evaluate(t1) + evaluate(t2)
evaluate Mult = evaluate(t1) * evaluate(t2)
evaluate Abs = myabs(evaluate(t1))
evaluate _ = 0 

我很困惑如何让 Number Integer 部分工作,因为我不知道如何提取数字并将它们映射到t1t2 in PlusMultAbs

由于我还在学习,如果我做错了什么,请告诉我!

1 个答案:

答案 0 :(得分:7)

以下是Plus案例的工作原理:

evaluate :: Term -> Integer
evaluate (Plus t1 t2) = evaluate t1 + evaluate t2
...

Plus构造函数有两个术语,因此我们在模式中需要两个名称(t1t2)。在这种情况下,t1t2都将是Term类型的值,这就是表达式evaluate t1evaluate t2有意义的原因。

然而,Number构造函数只有一个参数,例如Number 3,所以它的情况如下:

evaluate (Number x) = ...use x here...

此处变量x的类型为Integer