Recursion 变量、递归函数与类型推理

Recursion 变量、递归函数与类型推理,recursion,ocaml,type-inference,variant,Recursion,Ocaml,Type Inference,Variant,我对OCaml很陌生,但为了更好地理解如何使用它,我在过去的两天里一直在工作。 我最近做了很多事情,但有些事情阻碍了我前进 我正试图在OCaml中实现evalexpr。使用这个语言很容易,你可能会说:所以我想,第一次使用常规int,效果很好。 但现在我正试图用我自己的类型和函数来解决操作:当然,这并不像我想象的那么容易 type expr = | Number of MyInt.myint | Sum of (expr * expr) | Sub of (expr * expr)

我对OCaml很陌生,但为了更好地理解如何使用它,我在过去的两天里一直在工作。 我最近做了很多事情,但有些事情阻碍了我前进

我正试图在OCaml中实现evalexpr。使用这个语言很容易,你可能会说:所以我想,第一次使用常规int,效果很好。 但现在我正试图用我自己的类型和函数来解决操作:当然,这并不像我想象的那么容易

type expr =
  | Number of MyInt.myint
  | Sum of (expr * expr)
  | Sub of (expr * expr)
  | Product of (expr * expr)
  | Divide of (expr * expr)
  | Modulo of (expr * expr)

let rec evalexpr expr = function
  | Number n       -> n
  | Sum (a, b)     -> MyInt.add (evalexpr a) (evalexpr b)
  | Sub (a, b)     -> MyInt.sub (evalexpr a) (evalexpr b)
  | Product (a, b) -> MyInt.mul (evalexpr a) (evalexpr b)
  | Divide (a, b)  -> MyInt.div (evalexpr a) (evalexpr b)
  | Modulo (a, b)  -> MyInt.modulo (evalexpr a) (evalexpr b)
这对我来说似乎没问题。。。但编译器不同意。 我认为很明显“(evalexpr a)”的类型是MyInt.MyInt,因为它是evalexpr函数可以返回的唯一最终返回值:不过,编译器认为它的类型是“expr->MyInt.MyInt”

这是否意味着它不应用函数evalexpr并返回函数本身??如果是这样的话,为什么会这样?
我就是搞不懂。我想不出另一种方法来实现我在这里试图实现的目标。

evalexpr
函数中删除
expr

let rec evalexpr = function
    ...

如果将它放在那里,则表明该函数接受2个参数。第一个将绑定到变量
expr
,第二个将在函数体中匹配。然后,当您尝试递归调用它时,您可以使用单个参数调用
evalexpr
,从而生成需要第二个参数的函数。那么,您的函数自然无法在函数上运行,因此会出现错误。

好的,我认为应该是这样的:

let rec evalexpr = function
  | Number n       -> n
  | Sum (a, b)     -> MyInt.add (evalexpr a) (evalexpr b)
  | Sub (a, b)     -> MyInt.sub (evalexpr a) (evalexpr b)
  | Product (a, b) -> MyInt.mul (evalexpr a) (evalexpr b)
  | Divide (a, b)  -> MyInt.div (evalexpr a) (evalexpr b)
  | Modulo (a, b)  -> MyInt.modulo (evalexpr a) (evalexpr b)
function语句已经为您接受了一个参数,所以您实际声明的是一个接受一个参数并返回一个函数的函数