Recursion 将嵌套的有区别的联合表达式转换为字符串

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

我试图用有区别的并集来表达简单的数学表达式。例如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), "+", 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

我希望这足以让你开始