2

我是 OCaml 的新手,但过去两天都在工作,以便更好地了解如何使用它。我最近一直在做很多事情,但有些事情阻碍了我前进。

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

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 并返回函数本身?如果是这样,为什么它会那样做?我就是想不通。而且我想不出另一种方法来做我想要在这里实现的目标。

4

2 回答 2

7

expr从您的evalexpr功能中删除。

let rec evalexpr = function
    ...

通过在那里,您声明该函数需要 2 个参数。第一个将绑定到变量expr,第二个将在函数体中匹配。然后,当您尝试递归调用它时,您evalexpr使用单个参数调用产生期望第二个参数的函数。那么自然你的函数不能对函数进行操作,因此会出现错误。

于 2011-03-21T22:44:47.530 回答
2

Ok, I think it should be like this:

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 statement already takes an argument for you so what you actually declared was a function that takes one argument and returns a function

于 2011-03-21T22:53:44.073 回答