如何有两种方法互相呼叫?

我有点困惑,如何让两个方法来调用对方(即,有A()调用B()B()调用A() )。 看起来F#只是在代码中遇到了方法,所以如果没有,就说没有定义值或构造函数

我在这里错过了非常基本的东西吗?

3 Solutions collect form web for “如何有两种方法互相呼叫?”

“让rec …和…”是你所寻求的语法。

 let rec F() = G() and G() = F() 

另请参阅F#共recursion中的冒险 。

由于这个问题是关于方法的,Brian的答案是关于函数的,可能有必要指出的是,对于types可以使用类似的语法:

 type A() = let b = new B() member x.MethodA() = b.MethodB() and B() = member x.MethodB() = () 

还要注意的是,默认情况下,成员是“let rec”(实际上我不认为它们不能recursion)。

通过let声明函数

 let rec a () = b () and b () = () 

这些是相互recursion的function

相同types的方法

 type T () = member tA () = tB() member tB () = () 

这是微不足道的; 它只是工作。 注意亚伯的评论。

不同types的方法

 type TypeA () = member tA (b : TypeB) = bB() and TypeB () = member bB () = () 

这使用相互recursiontypestype ... and语法。

笔记

通常情况下,只有在双方发生呼叫时才使用。 否则,重新排列声明可能会更好,所以被调用的函数是第一位的。 types推理和可读性通常有助于避免循环依赖,并且不会暗示它们在哪里不被使用。

我build议编辑这个问题,要么要求一般的函数,要么提出不同的types(在这种情况下,我会从这个答案中删除前两个例子)。 方法通常被认为是函数的一个子集,这是一般的math术语。 但是,所有F#函数在技术上都是CLI方法 ,因为它们是编译到的。 就目前而言,问题的要求并不清楚,但我从公认的答案中可以看出,它不仅要求方法,而且还要标题所暗示的。

  • recursion列出所有目录和文件
  • 为什么recursion比迭代更受欢迎?
  • 如何获取MATLAB中的特定目录下的所有文件?
  • lambda函数可以recursion吗?
  • 河内塔:recursionalgorithm
  • Haskell有尾recursion优化吗?
  • 什么是可重入函数?
  • recursiongenericstypes的实例化在它们嵌套的越深处指数地减慢。 为什么?
  • recursion使用yield
  • 任何Javascript引擎尾部调用优化?
  • Python中的最大recursion深度是多less,以及如何增加?