问题描述
我有一个作业,有一个我根本不理解的问题。他们要的是什么?不知道这是否是一个适合自己的问题,但是我完全陷入僵局,所以如果有人帮助,这将意味着很多!
问题:
让我们考虑用户定义的数据类型 数据Ast = V Int | P Ast Ast |阿斯特·阿斯特 我们假设每个叶子V x代表数字x,而P和M代表 他们的论点的加法和乘法。编写功能
eval :: Ast -> Int
将该Ast评估为算术表达式,例如
eval (V 5) = 5
eval (P (V 55) (M (V 2) (V 3))) = 55 + (2 * 3) = 61
eval (M (P (V 12) (V 3)) (M (V 2) (V 5))) = (12 + 3) * (2 * 5) = 150
解决方法
使用Haskell这样的语言的好处是,定义实际上看起来几乎像示例。您提供的内容实际上是一个语法上有效的定义:
eval :: Ast -> Int
eval (V 5) = 5
eval (P (V 55) (M (V 2) (V 3))) = 55 + (2 * 3)
eval (M (P (V 12) (V 3)) (M (V 2) (V 5))) = (12 + 3) * (2 * 5)
它既不是最小也不是完整。例如,eval (V 5)
可以,但是eval (V 6)
不能。解?好吧,不要硬编码5
的特殊情况,而是允许使用任何int值:
eval (V x) = x
同样,您应该制作分别与sum /积形式的任何匹配的子句,而不仅仅是一个特定的示例表达式。
eval (P l r) = _ + _
要填补这些空白,您需要与l
和r
对应的已经求值的表达式。好吧,l
和r
不会被求值...如果只有我们有一个接受表达式并给出求值形式的函数...