Haskell: eval :: Ast -> Int
Haskell: eval :: Ast -> Int
我有一个作业,有一个问题我就是不明白。他们要求什么?不确定这是否是一个非常合适的问题,但我的大脑完全冻结了,所以如果有人提供帮助,那将意义重大!
问题:
让我们考虑用户定义的数据类型
数据 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)
不行。解决方案?好吧,不要 hard-code 5
的特殊情况,而是允许任何 int 值:
eval (V x) = x
同样,您应该分别匹配 任何东西 和/积形式的子句,而不仅仅是一个特定的示例表达式。
eval (P l r) = _ + _
要填补空白,您需要 already-evaluated 个对应于 l
和 r
的表达式。好吧,l
和 r
没有被评估......如果我们有一个函数接受表达式并给我们他们的评估形式......
我有一个作业,有一个问题我就是不明白。他们要求什么?不确定这是否是一个非常合适的问题,但我的大脑完全冻结了,所以如果有人提供帮助,那将意义重大!
问题:
让我们考虑用户定义的数据类型 数据 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)
不行。解决方案?好吧,不要 hard-code 5
的特殊情况,而是允许任何 int 值:
eval (V x) = x
同样,您应该分别匹配 任何东西 和/积形式的子句,而不仅仅是一个特定的示例表达式。
eval (P l r) = _ + _
要填补空白,您需要 already-evaluated 个对应于 l
和 r
的表达式。好吧,l
和 r
没有被评估......如果我们有一个函数接受表达式并给我们他们的评估形式......