use*_*633 2 interpreter haskell abstract-syntax-tree
我还在学习Haskell,这个问题看起来非常基本,但它一直困扰着我.
鉴于以下内容
data Term =
Number Integer
| Abs Term
| Plus Term Term
| Mult Term Term
deriving (Eq, Show)
Run Code Online (Sandbox Code Playgroud)
我想创建一个解释器,如果我打电话,例如,
evaluate (Plus (Number 10) (Number 10))
Run Code Online (Sandbox Code Playgroud)
它将返回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
Run Code Online (Sandbox Code Playgroud)
我很困惑,如何让Number Integer一部分工作,因为我不知道如何提取号码,并将其映射到t1和t2中Plus,Mult和Abs.
由于我还在学习,如果我做了一些完全错误的事情,请告诉我!
以下是该Plus案例的工作原理:
evaluate :: Term -> Integer
evaluate (Plus t1 t2) = evaluate t1 + evaluate t2
...
Run Code Online (Sandbox Code Playgroud)
该Plus构造函数有两个方面,所以我们在模式(需要两个名字t1和t2).在这种情况下,两个t1和t2将类型的值Term这就是为什么表达evaluate t1和evaluate t2意义.
该Number构造函数,但是,只有一个参数,例如Number 3,所以它的情况会是这样的:
evaluate (Number x) = ...use x here...
Run Code Online (Sandbox Code Playgroud)
这里变量x将具有类型Integer.