我仍在学习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
由于我不知道如何提取数字并将其映射到Plus
、Mult
和Abs
中的t1
和t2
,因此我很困惑如何使Number Integer
部分工作。
既然我还在学习,如果我做错了什么,请告诉我!
以下是Plus
案例的工作方式:
evaluate :: Term -> Integer
evaluate (Plus t1 t2) = evaluate t1 + evaluate t2
...
Plus
构造函数有两个项,因此我们需要模式中的两个名称(t1
和t2
)。在这种情况下,t1
和t2
都将是Term
类型的值,这就是表达式evaluate t1
和evaluate t2
有意义的原因。
然而,Number
构造函数只有一个参数,例如Number 3
,因此它的情况看起来像:
evaluate (Number x) = ...use x here...
这里,变量x
将具有类型Integer
。