Recursion 将嵌套的有区别的联合表达式转换为字符串
我试图用有区别的并集来表达简单的数学表达式。例如1+2*3,可以使用二进制运算符从整数常量构造。表达式使用以下F#声明建模:Recursion 将嵌套的有区别的联合表达式转换为字符串,recursion,f#,Recursion,F#,我试图用有区别的并集来表达简单的数学表达式。例如1+2*3,可以使用二进制运算符从整数常量构造。表达式使用以下F#声明建模: type expr = | Const of i:int | BinOpr of a: expr * b:string * c:expr 当使用构造函数BinOpr生成表达式时,构造函数Const生成一个整数常量,运算符以字符串形式给出(例如:“+”) 下面是使用此模型的表达式的两种表示形式 let b = BinOpr(Const(2), "+", C
type expr =
| Const of i:int
| BinOpr of a: expr * b:string * c:expr
当使用构造函数BinOpr生成表达式时,构造函数Const生成一个整数常量,运算符以字符串形式给出(例如:“+”)
下面是使用此模型的表达式的两种表示形式
let b = BinOpr(Const(2), "+", Const(2))
let c = BinOpr(BinOpr(Const(2), "-", Const(3)), "+", Const(2))
我正在尝试创建一个函数,将这些表达式转换为字符串,例如,使用b作为参数,结果应该是
"2 + 2"
或者用c表示为“2-3+2”
我不知道如何诚实地解决这个问题,并寻找可以帮助我找到解决方案的指针 一旦您必须对歧视性结合的每种情况执行操作,您应该认为
匹配。。。使用
。所以你把它放到一个函数中
let print e =
match e with
| Const i -> ...
| BinOpr (l, op, r) -> ...
但是,您的类型定义是递归的,因此您很可能也需要递归函数。为此,在print
前面添加rec
关键字;i、 e.let print e
变为let rec print e
我希望这足以让您开始。一旦您必须对歧视性工会的每一个案例执行操作,您应该认为
匹配。。。使用
。所以你把它放到一个函数中
let print e =
match e with
| Const i -> ...
| BinOpr (l, op, r) -> ...
但是,您的类型定义是递归的,因此您很可能也需要递归函数。为此,在print
前面添加rec
关键字;i、 e.let print e
变为let rec print e
我希望这足以让你开始