题
我对如何让两种方法互相调用有点困惑(即,有 A()
称呼 B()
和 B()
称呼 A()
)。似乎 F# 仅在代码中遇到该方法后才“看到”该方法,因此如果没有,它只是说 值或构造函数尚未定义.
我在这里错过了一些非常基本的东西吗?
解决方案
其他提示
由于问题是关于方法和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方法的,因为这是他们被编译成。由于是,目前还不清楚是什么的问题是问了,但我从接受的答案假设它不仅要求方法,如标题将暗示。
不隶属于 StackOverflow