recursion - OCaml 中的递归调用
问题描述
我正在尝试使用以下代码在 OCaml 中实现递归调用:
| Add (x,y) ->
begin
match x, y with
| x, Bra y -> Bra (Implies(x, y))
| x, Add (a, b) -> Add(x, Add(a, b))
| x, y -> Implies(x, y)
end
在用 2 个案例进行测试时,我发现在案例 2 中程序进入了一个无限循环。
+(p,[] z)
它返回[](p => z)
+(p,+(q,[] z))
它应该返回[](p => (q => z))
,而不是进入永无止境的循环。
我可以看到案例 2 的问题是因为我Add
在另一个Add
运营商内部调用。但是我在这里理解循环的“退出”应该由 match 子句的第一行给出,但是它不起作用。
如果您有任何建议,我将不胜感激。只是为了澄清,我正在为运算符使用下一个语法
Add + , Bra [], Implies =>
解决方案
在这段代码摘录中,一些值(比如说v
)匹配Add (x,y)
。特别是,有y
match的情况Add (a, b)
。这意味着v
等于这个值:
Add (x, Add (a, b))
但是,请注意,在这种情况下,您的函数的返回值也是:
Add (x, Add (a, b))
在那里,v
原样返回。
如果您的代码循环直到没有更多内容Add
(我不知道,因为代码不完整,请发布一个Minimal, Reproducible Example),那么您的代码的这个分支会产生一个固定点,这可以解释无限循环。
推荐阅读
- html - 如何显示图片使其看起来没有连接
- vue.js - vue.js - 使用 i18n 的弹出窗口中的多种语言
- android - 从 url 下载图像并保存到缓存
- javascript - 在本机反应中控制平移视图的速度
- reactjs - Nextjs没有编译所有tailwindcss类
- c# - Acumatica:无法从数据网格中清除 PropertyException
- c# - 从对象列表中选择一个随机对象
- google-cloud-platform - 谷歌云服务器如何获取新的授权码?
- go - 吐出代码格式化错误,而不是在 golang 中实际格式化
- python - Invalid value specified for connection string attribute