F# 如何让两个方法互相调用?

F# 如何让两个方法互相调用?,f#,mutual-recursion,F#,Mutual Recursion,对于如何让两个方法互相调用(即havea()callB()和B()calla()),我有点困惑。似乎F#只在代码中遇到方法后才“看到”它,所以如果没有,它只会说还没有定义值或构造函数 我是不是错过了一些非常基本的东西?'。。。“和…”是您寻求的语法 let rec F() = G() and G() = F() 另请参见。因为问题是关于方法的,而Brian的答案是关于函数的,所以指出您可以对类型使用类似的语法可能是有用的: type A() = let b = new

对于如何让两个方法互相调用(即have
a()
call
B()
B()
call
a()
),我有点困惑。似乎F#只在代码中遇到方法后才“看到”它,所以如果没有,它只会说还没有定义值或构造函数


我是不是错过了一些非常基本的东西?

'。。。“和…”是您寻求的语法

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

另请参见。

因为问题是关于方法的,而Brian的答案是关于函数的,所以指出您可以对类型使用类似的语法可能是有用的:

type A() =
    let b = new B()
    member x.MethodA() = b.MethodB()
and B() =
    member x.MethodB() = ()
还要注意,默认情况下,成员是“let rec”(事实上,我不认为它们不是递归的)。

通过let声明的函数 这些是相互递归的函数

同一类型中的方法 这是微不足道的;它只是工作。不过请注意Abel的评论

不同类型中的方法 这将使用
类型。。。和
相互递归类型的语法

笔记 通常,
仅在双向调用时使用。否则,最好对声明重新排序,使被调用的函数排在第一位。它通常有助于类型推断和可读性,以避免循环依赖,并且在不使用循环依赖的地方不暗示循环依赖

我建议对问题进行编辑,要么要求提供一般功能,要么要求提供不同类型的功能(在这种情况下,我将从回答中删除前两个案例)。方法通常被认为是函数的子集,这是一般的数学术语。但是,从技术上讲,所有F#函数都是CLI方法,因为这就是它们编译的目的。就目前而言,这个问题要求的是什么还不清楚,但我从公认的答案中推测,它不仅要求方法,正如标题所暗示的那样。

F#4.1介绍

这些是
关键字的替代选项

module rec PingPong = // <------ rec keyword here.

    let pong() = 
        printfn "pong"
        ping() 

    let ping () = 
        printfn "ping"
        pong()

module rec PingPong=//在不同类型的方法中,您说它“微不足道;它只是工作”,但有一个微妙之处很容易被忽略:当您使用
inline
和/或某些成员约束时,可能需要您按顺序声明它们(即,反向引用将产生奇怪且难以诊断的错误)。请参阅错误报告最佳解决方案。然而,如果我们需要A()调用B()和B()调用A(),那么我们的函数设计就有问题。理想情况下,我们不应该遇到这种情况。如果我错了,请纠正我。@ozgur想象您想要创建一个JSON解析器。然后需要一个函数来解析元素可以是对象的列表。您需要一个函数来解析其值可以是列表的对象。这种类型的递归并不像你想象的那么罕见。
type T () =
    member t.A () = t.B()
    member t.B () = ()
type TypeA () =
    member t.A (b : TypeB) = b.B()

and TypeB () =
    member b.B () = ()
module rec PingPong = // <------ rec keyword here.

    let pong() = 
        printfn "pong"
        ping() 

    let ping () = 
        printfn "ping"
        pong()