【问题标题】:How to refactor this pattern matched OCaml piece of code如何重构此模式匹配的 OCaml 代码段
【发布时间】:2016-10-23 03:47:06
【问题描述】:

我正在通过巴黎狄德罗大学提供的 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】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-07
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      • 2022-01-11
      • 2011-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多