关于如何让两个方法相互呼叫(即有A()
呼叫B()
和B()
呼叫A()
),我有点困惑.似乎F#只在代码中遇到它后"看到"该方法,所以如果它没有,它只是说值或构造函数尚未定义.
我错过了一些非常基本的东西吗?
'让rec ......和......'是你寻求的语法.
let rec F() = G() and G() = F()
另见F#Co-Recursion中的冒险.
既然问题是关于方法的,而Brian的答案是关于函数的,那么指出你可以对类型使用类似的语法是有用的:
type A() = let b = new B() member x.MethodA() = b.MethodB() and B() = member x.MethodB() = ()
另请注意,默认情况下成员是'let rec'(实际上我不认为它们不能递归).
F#4.1引入了相互递归的模块和命名空间.
这些是and
关键字的替代品.
module rec PingPong = // <------ rec keyword here. let pong() = printfn "pong" ping() let ping () = printfn "ping" pong()
该rec
关键字定义了"允许所有包含的代码相互递归"的模块和命名空间.