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