如何有两种方法互相呼叫?
我有点困惑,如何让两个方法来调用对方(即,有A()
调用B()
和B()
调用A()
)。 看起来F#只是在代码中遇到了方法,所以如果没有,就说没有定义值或构造函数 。
我在这里错过了非常基本的东西吗?
“让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 () = ()
这使用相互recursiontypes的type ... and
语法。
笔记
通常情况下,只有在双方发生呼叫时才使用。 否则,重新排列声明可能会更好,所以被调用的函数是第一位的。 types推理和可读性通常有助于避免循环依赖,并且不会暗示它们在哪里不被使用。
我build议编辑这个问题,要么要求一般的函数,要么提出不同的types(在这种情况下,我会从这个答案中删除前两个例子)。 方法通常被认为是函数的一个子集,这是一般的math术语。 但是,所有F#函数在技术上都是CLI方法 ,因为它们是编译到的。 就目前而言,问题的要求并不清楚,但我从公认的答案中可以看出,它不仅要求方法,而且还要标题所暗示的。