代码之家  ›  专栏  ›  技术社区  ›  Sean

用于计算加法和减法的OCaml函数

  •  1
  • Sean  · 技术社区  · 6 年前

    this one . 然而,我仍然有困难,这导致我问我自己的问题。

    type equation =
      | True
      | False
      | Equal of exp * exp
    and exp =
      | Val of int
      | Add of exp * exp
      | Sub of exp * exp
    
    let rec eval : equation -> bool
    = fun f ->
      match f with
      | True -> true
      | False -> false
      | Equal (x, y) -> match (x, y) with
                        | (Val a, Val b) -> if (x = y) then true else false
                        | ((Add (Val a, Val b), c) -> eval (Equal (Val (a + b), c))
    

    程序不完整,递归调用 eval 最后一行是我被卡住的地方。我想到的一个具体输入示例是:

    eval (Equal (Add (Add (Val 1, Val 2), Val 3), Val 6))

    这应该评估为 true ,因为 Add 加起来是6,然后 Equal 比较 Val 6 值6 添加 Add (Val 2, Val 2) Val 3 添加 具有 值3 . 我现在写的程序只计算其中一个 添加 的。

    有什么我应该考虑或记住的吗?欢迎任何反馈。非常感谢。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Ulugbek Abdullaev    6 年前

    正如@Amadan提到的,定义一个首先将表达式求值为int的函数更容易 eval_exp: exp -> int . 然后您可以计算元组中的两个表达式 Equal(e1, e2) eval: equation -> bool ).

    类型中也不需要值True和False equation ,因为您可以直接从函数返回bool,而无需模式匹配。请注意,如果出于某种原因再次将它们传递给 eval 功能。

    type equation =
      Equal of exp * exp
    and exp =
      | Val of int
      | Add of exp * exp
      | Sub of exp * exp
    
    let rec eval (e: equation) : bool =
      let rec eval_exp e =
        match e with
        | Val i -> i
        | Add (e1, e2) -> (eval_exp e1) + (eval_exp e2)
        | Sub (e1, e2) -> (eval_exp e1) - (eval_exp e2)
      in
      match e with
      | Equal (e1, e2) ->
          if (eval_exp e1) = (eval_exp e2)
          then true
          else false