2014-11-09 94 views
2

我仍然在学习Haskell,这个问题看起来很基本,但是它一直在跺脚。使用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部分工作,因为我不知道如何提取数字并将它们映射到t1t2Plus,MultAbs

由于我还在学习,如果我正在做一些完全错误的事,请告诉我!

回答

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

+0

感谢您的帮助!现在我得到了我的plus,mult和数字工作。出于某种原因,我的腹肌给予的意思是“评估的方程式”有不同数量的参数“错误,你知道问题是什么吗?我已更新评估Abs t1 = myabs(评估(t1)) – user3277633 2014-11-09 17:42:55

+0

我已修复它!非常感谢你的帮助 – user3277633 2014-11-09 17:49:14