gpt4 book ai didi

functional-programming - 模式匹配返回数学表达式的字符串表示

转载 作者:行者123 更新时间:2023-12-04 13:55:13 25 4
gpt4 key购买 nike

我必须编写一个带有表达式的函数转储

type expression = 
| Int of int
| Float of float
| Add of expression * expression
| Sub of expression * expression
| Mult of expression * expression
| Div of expression * expression
;;

并返回它的字符串表示。
例如:
dump (Add (Int 1, Int 2));;
dump (Mult (Int 5, Add(Int 2, Int 3)), Int 1)

应该分别返回
- : string = "1+2"
- : string = "5*(2+3)-1"

我写过这样的东西:
let rec dump e = match e with
| Int a -> string_of_int a
| Float a -> string_of_float a
| Add (e1,e2) -> "(" ^ (dump e1) ^ "+" ^ (dump e2) ^ ")"
| Sub (e1,e2) -> "(" ^ (dump e1) ^ "-" ^ (dump e2) ^ ")"
| Mult (e1,e2) -> (dump e1) ^ "*" ^ (dump e2)
| Div (e1,e2) -> (dump e1) ^ "/" ^ (dump e2)
;;

和返回的表达式是正确的,但仍然不是最佳的。
(对于 Add (Int 1, Int 2))它是 (1+2) 并且应该是 1+2 )。我怎样才能解决这个问题?
(没有嵌套模式匹配,这不是一个好主意)

最佳答案

让我们想想什么时候需要括号:

首先,总是在某些操作周围包裹括号是错误的方法。术语是否需要括号不仅取决于术语中使用的运算符,还取决于术语是哪个运算符的操作数。

例如。当1+23+4+ 的操作数,应该是 1+2+3+4 - 没有括号。但是,如果运算符(operator)是 * ,它必须是 (1+2) * (3+4) .

那么对于哪些运算符组合我们需要括号呢?
+的操作数永远不需要括号。如果操作数是乘积或商,它们无论如何都具有更高的优先级,如果操作数是差值,则不需要括号,因为 x + (y - z) = x + y -z .

-它有点不同。 */仍然不需要括号,因为它们具有更高的优先级,但是 +-如果它们在第二个操作数中,因为 x + y - z = (x + y) - z ,但是 x - y + z != x - (y + z) .

使用 Mult 时,如果两个操作数是 Add 或 Sub,则需要用括号括起来,但如果它们是 Mult 或 Div,则不需要。

对于 Div,如果第一个操作数是 Add 或 Sub,则需要用括号括起来,而第二个操作数总是需要用括号括起来(当然,除非它是 Int 或 Float)。

关于functional-programming - 模式匹配返回数学表达式的字符串表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4134855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com