The*_*ake 2 recursion ocaml type-inference variant
我是OCaml的新手,但过去两天都在工作,以便更好地理解如何使用它.我最近做了很多事情但有些事情让我不能前进.
我正在尝试在OCaml中实现evalexpr.很容易使用这个语言,你会说:所以我想,我做的第一个,使用常规的int,工作得很好.但是现在我正在尝试使用我的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)
Run Code Online (Sandbox Code Playgroud)
这似乎对我好......但编译器不同意.我认为很明显"(evalexpr a)"的类型是MyInt.myint,因为它是evalexpr函数可以返回的唯一最终返回值:仍然,编译器认为它的类型是"expr - > MyInt.myint" .
这是否意味着它不应用函数evalexpr并返回函数本身?如果是这样,为什么它会这样做呢?我只是想不出来.我想不出另一种方法来做我想在这里实现的目标.
expr
从您的evalexpr
功能中删除.
let rec evalexpr = function
...
Run Code Online (Sandbox Code Playgroud)
通过它,你宣布该功能需要2个参数.第一个将绑定到变量expr
,第二个将在函数体中匹配.然后,当您尝试递归调用它时,evalexpr
使用单个参数调用,产生期望第二个参数的函数.那自然你的函数不能对函数进行操作,从而导致错误.