我可以使用F#中的属性声明相互递归函数吗?

时间:2016-08-29 13:03:59

标签: f#

因此;这段代码编译得很好(虽然我不建议运行它......):

let rec firstFunc () =
  secondFunc ()

and secondFunc () =
  firstFunc ()

但是!此代码不会:

let rec firstFunc () =
  secondFunc ()

[<CompiledName "SecondFunc">]
and secondFunc () =
  firstFunc ()

有没有办法解决这个限制?

3 个答案:

答案 0 :(得分:7)

您可以在and之后添加该属性,它似乎可以正常编译。

let rec firstFunc () =
  secondFunc ()

and [<CompiledName "SecondFunc">] secondFunc () =
  firstFunc ()

答案 1 :(得分:2)

如果您只需要一个函数的CompiledName属性,而不是两个函数,您可以这样做:

[<CompiledName "SecondFunc">]
let rec secondFunc () =
  firstFunc ()

and firstFunc () =
  secondFunc ()

但是如果你需要它,我还没有找到解决方案。

要跟进Pierre Irrmann的回答,如果您希望在单独的一行中看到您的属性,您还可以执行以下操作:

let rec firstFunc () =
    secondFunc ()

and [<CompiledName("SecondFunction")>]
    secondFunc () =
        firstFunc ()

甚至:

let rec firstFunc () =
    secondFunc ()

and
    [<CompiledName("SecondFunction")>]
    secondFunc () =
        firstFunc ()

唯一的要求是secondFunc ()声明及其属性必须缩进至少一个空格。所以即使这样也可行:

let rec firstFunc () =
    secondFunc ()

and
 [<CompiledName("SecondFunction")>]
 secondFunc () =
     firstFunc ()
但是,我并不特别推荐最后一个选项。我测试了它并且它有效,但看起来很难看。最好缩进整个缩进级别(四个或两个空格,无论你使用什么),而不是让#34;可爱&#34;并在这种情况下缩进一个空格。

答案 2 :(得分:1)

到目前为止,我设法提出的最好成绩是:

let rec firstFunc () =
  fakeSecondFunc ()

and fakeSecondFunc () =
  firstFunc ()

[<CompiledName "SecondFunc">]
let secondFunc () =
  fakeSecondFunc ()