gpt4 book ai didi

recursion - 变体、递归函数和类型推断

转载 作者:行者123 更新时间:2023-12-02 10:20:57 24 4
gpt4 key购买 nike

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

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

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” .

这是否意味着它不应用函数evaexpr并返回函数本身?如果是这样,它到底为什么要这么做?我就是想不通。我想不出另一种方法来实现我在这里想要实现的目标。

最佳答案

evaexpr 函数中删除 expr

let rec evalexpr = function
...

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

关于recursion - 变体、递归函数和类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5384429/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com