2016-08-29 4 views
3

だから;このコードはうまくコンパイルされますが(私はそれを実行するよう勧めません...):F#の属性を持つ相互再帰関数を宣言できますか?

let rec firstFunc() = 
    secondFunc() 

and secondFunc() = 
    firstFunc() 

しかし!このコードはそうではありません。

let rec firstFunc() = 
    secondFunc() 

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

この制限を回避する方法はありますか?

答えて

6

andの後ろに属性を追加すると、コンパイルがうまくいくように見えます。

let rec firstFunc() = 
    secondFunc() 

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

ありがとうございます - ベサはちょうどツイッターで同じことを指摘しましたhttps://twitter.com/VesaKarvonen/status/770247570593574912 – mavnn

+0

私は美しい他のフォーマットを好むので残念です。まぁ。それが人生だ。 – mavnn

+0

これをフォーマットする別の方法については、私の答えを見てください(私はそれを編集しました)。ピエール・イルマンの答えにチェック・マークをつけておきますが、私は彼の答えがなければそれについて知りませんでした。彼はこの功績に対する功績に値する。 – rmunn

1

私がこれまでに出てくることができた最高のは、次のとおりです。

let rec firstFunc() = 
    fakeSecondFunc() 

and fakeSecondFunc() = 
    firstFunc() 

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

一つだけの機能ではなく、両方のCompiledName属性が必要な場合は、行うことができます:

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

and firstFunc() = 
    secondFunc() 

しかし、両方でそれが必要な場合は、解決策がまだ見つかりませんでした。

let rec firstFunc() = 
    secondFunc() 

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

かさえ:

let rec firstFunc() = 
    secondFunc() 

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

唯一の要件あなたが別の行に自分の属性を見て好きなら

はピエールIrrmannの答えをフォローアップするために、あなたはまた、次の操作を行うことができsecondFunc()宣言とその属性は、少なくとも1つのスペースをインデントしなければならないということです。したがって、これでも動作します:

let rec firstFunc() = 
    secondFunc() 

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

私は特に最後のオプションは、お勧めしません。私はそれを試して、それは動作しますが、それは醜いように見えます。このような場合には、「かわいい」を得て1つだけのスペースをインデントするよりも、インデントレベル全体(あなたが使っているものであれば、4つまたは2つのスペース)をインデントする方が良いでしょう。

+0

ああ、良い。 Pierre Irrmannが正解を見つけました。 – rmunn

関連する問題