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中程序进入了一个无限循环。

  1. +(p,[] z)它返回[](p => z)

  2. +(p,+(q,[] z))它应该返回[](p => (q => z)),而不是进入永无止境的循环。

我可以看到情况2的问题,是因为我在另一个Add操作符内调用Add。但我明白这里的"退出"循环的值应该由match子句的第一行给出,但是它不起作用。

如果你有任何建议,我将不胜感激。为了澄清一下,我对操作符 使用了下面的语法
Add + , Bra [], Implies =>

在此代码摘录中,某些值(假设v)与Add (x,y)匹配。特别地,存在yAdd (a, b)匹配的情况。这意味着v等于这个值:

Add (x, Add (a, b))

但是,注意在这种情况下函数的返回值也是:

Add (x, Add (a, b))

这里,v不变返回。

如果你的代码循环,直到没有更多的Add(我不知道,因为代码是不完整的,请张贴一个最小的,可重复的例子),那么你的代码的这个分支产生一个固点,这可能解释无限循环。

最新更新