骆驼抽象叙事树

时间:2020-09-22 18:39:49

标签: ocaml abstract-syntax-tree software-design ocamlbuild

我有有效的表达式,但是当我尝试使用当前的评估函数评估表达式时,出现以下错误-“错误:此模式与类型'a *'b的值匹配,但是期望有与类型的值匹配的模式args”。您能帮我解决这个问题吗?

type expr = Const of int 
          | Var of string
          | Plus of args
          | Mult of args
          | Minus of args
          | Div of args
              
and args = {arg1:expr; arg2:expr};; 

let rec eval = function
  | Const c -> c
  | Plus (f, g) -> eval f + eval g
  | Minus(f, g) -> eval f - eval g
  | Mult(f, g) -> eval f * eval g
  | Div(f, g) -> eval f / eval g 
;;

1 个答案:

答案 0 :(得分:1)

像您声明的Plus之类的构造函数带有带括号的参数。您似乎正在使用适合于记录类型(带有花括号和字段名称)的语法。但是您的expr定义中没有记录类型。

这是expr类型的有效值:

Plus (Const 3, Const 8)

您的eval函数不处理变量的求值(Var构造函数)。这只是警告,不是错误,但是如果您尝试评估类似Var "abc"的内容,则会导致运行时异常。

您没有说出这些错误中的哪一个,但是我希望这仍然有帮助。

更新

正如@ review.ocaml.org上的@CraigFe所指出的,您在expr的定义和测试用例之间不匹配。您可以重写expr的定义以使测试用例起作用,或者可以重写测试例以使其与当前的expr定义一起使用。

要匹配测试用例,您需要这样的定义:

type expr2 =
    | Const of int
    | Plus of { arg1 : expr2; arg2: expr2 }

那么您可以拥有一个像这样的值:

Plus { arg1 = Const 3; arg2 = Const 8 }

但是,在OCaml中,字段名称不能以大写字母开头。这意味着Arg1Arg2必须是arg1arg2。所以我个人认为测试用例是需要修改的部分。

我不了解有关相互递归定义的部分(尽管我知道这些当然是什么)。一般来说,我会说您最大的困难是问题陈述,而不是代码。