【问题标题】:Converting nested discriminated union expressions into strings将嵌套的可区分联合表达式转换为字符串
【发布时间】:2020-01-03 15:26:47
【问题描述】:

我正在尝试使用可区分联合来表达简单的数学表达式。例如 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"

我无法弄清楚我将如何诚实地解决这个问题并寻找可以帮助我找到解决方案的指针。

【问题讨论】:

    标签: recursion f#


    【解决方案1】:

    一旦您必须对受歧视联合的每个案例执行操作,您就应该考虑match ... with。所以你把它放到一个函数中

    let print e =
        match e with
        | Const i -> ...
        | BinOpr (l, op, r) -> ...
    

    不过,您的类型定义是递归的,因此您很可能还需要一个递归函数。为此,请在print 前面添加rec 关键字;即let print e 变为let rec print e

    我希望这足以让你开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-08
      • 2019-06-05
      • 2019-04-24
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      相关资源
      最近更新 更多