如何重构这个模式匹配的 OCaml 代码

问题描述 投票:0回答:1

我正在通过巴黎狄德罗大学提供的 MOOC 学习 OCaml。目前我还没有遇到函数式思维的重大困难,但我确实发现这段代码有点难看。我如何重构它,以便我可以编写 e1 和 e2 的一般评估,用于简化函数中包含的 match 语句的两个最新分支。该函数的思想是将e * 0或0 * e转变成0; e * 1 或 1 * e 变为 e;将 e + 0 或 0 + e 转化为 e。

type exp =
  | EInt of int
  | EAdd of exp * exp
  | EMul of exp * exp;;

let eval expression = 
  let rec aux = function
    | EInt x        -> x
    | EAdd (e1, e2) -> (aux e1) + (aux e2)
    | EMul (e1, e2) -> (aux e1) * (aux e2)
  in aux expression;;

let simplify expression = 
  match expression with
  | EInt _        -> expression
  | EAdd (e1, e2) -> 
      let v1 = eval e1 in
      let v2 = eval e2 in
      if v1 = 0 then e2
      else if v2 = 0 then e1
      else expression 
  | EMul (e1, e2) ->
      let v1 = eval e1 in
      let v2 = eval e2 in
      if v1 = 0 || v2 = 0 then EInt 0
      else if v1 = 1 then e2
      else if v2 = 1 then e1 
      else expression;;

我很感谢你的帮助! 谢谢!

functional-programming pattern-matching ocaml
1个回答
1
投票

我想你可以有这样的功能:

let simplifyop identity zero exp e1 e2 =
    let v1 = eval e1 in
    let v2 = eval e2 in
    if v1 = identity then e2
    else if v2 = identity then e1
    else
        match zero with
        | None -> exp
        | Some z ->
            if v1 = z || v2 = z then EInt z
            else exp

那么你的案例看起来像这样:

| EAdd (e1, e2) -> simplifyop 0 None expression e1 e2
| EMul (e1, e2) -> simplifyop 1 (Some 0) expression e1 e2
© www.soinside.com 2019 - 2024. All rights reserved.