我对如何让两种方法互相调用有点困惑(即,有 A() 称呼 B()B() 称呼 A())。似乎 F# 仅在代码中遇到该方法后才“看到”该方法,因此如果没有,它只是说 值或构造函数尚未定义.

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

有帮助吗?

解决方案

“让REC ......还有......”是你所寻求的语法。

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

参见冒险在F#钴-Recursion

其他提示

由于问题是关于方法和Brian的回答是关于功能,也许它指出,你可以使用类型类似的语法是有用的:

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

还要注意的是成员“让REC”在默认情况下(其实我不认为他们可以不递归)。

F# 4.1 介绍 相互递归的模块和命名空间.

这些是替代方案 and 关键词。

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

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

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

rec 关键字定义“允许所有包含的代码相互递归”的模块和命名空间。

经由设声明

功能

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

这些是相互递归功能

相同类型的内

方法

type T () =
    member t.A () = t.B()
    member t.B () = ()

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

不同类型的内

方法

type TypeA () =
    member t.A (b : TypeB) = b.B()

and TypeB () =
    member b.B () = ()

此使用type ... and语法相互递归类型

备注

通常,and仅当呼叫发生在两个方向上使用。否则,它可能是更好的重新排序的声明,以使被调用函数是第一位的。它往往是类型推断和可读性有助于避免循环依赖性,并且不使用其中它们不意味着它们。

我建议编辑的问题要么为功能一般要求,或要求不同类型的(在这种情况下,我会删除从该答案前两种情况)。方法通常被认为是功能的子集,这是一般的数学术语。然而,所有的F#的功能在技术上的 CLI方法的,因为这是他们被编译成。由于是,目前还不清楚是什么的问题是问了,但我从接受的答案假设它不仅要求方法,如标题将暗示。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top