我有一个作业,有一个问题我就是不明白。他们要求的是什么?不确定这是否是一个非常合适的问题,但我完全处于大脑冻结状态,所以如果有人提供帮助,那将意味着很多!
题:
让我们考虑用户定义的数据类型 data Ast = V Int | P AST | M Ast Ast 我们假设每个叶子 V x 代表数字 x,而 P 和 M 代表它们参数的加法和乘法。编写函数
eval :: Ast -> Int
Run Code Online (Sandbox Code Playgroud)
它将这样的 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
Run Code Online (Sandbox Code Playgroud)
像 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)
Run Code Online (Sandbox Code Playgroud)
只是,它既不是最小的,也不是完整的。例如,eval (V 5)会好的,但eval (V 6)不会。解决方案?好吧,不要硬编码 的特殊情况5,而是允许任何 int 值:
eval (V x) = x
Run Code Online (Sandbox Code Playgroud)
同样的,你应该是匹配的条款作出任何一笔/产品的形式,分别不只是一个具体的例子表达。
eval (P l r) = _ + _
Run Code Online (Sandbox Code Playgroud)
要填补空白,您将需要与l和对应的已计算表达式r。好吧,l并且r不会被评估......如果我们有一个接受表达式并为我们提供评估形式的函数......
| 归档时间: |
|
| 查看次数: |
179 次 |
| 最近记录: |