2012-04-25 5 views
1

参照によって関数を呼び出すオプションはありますか?例えばF#での参照による呼び出し

: 私はfunc1の中で変数xを持っていると私はそれが(などその新しい値を返さずに)それを変更することができますので、関数func2にそれを送信する場合

let func1 = 
    let mutable x = 1 
    func2 x 
    System.Console.WriteLine(x) 

let func2 x = 
    x <- x + 1 

だから、関数func1が印刷されます呼び出します"2" ..

可能ですか?もしそうなら、どうですか?

ありがとうございました。

+1

ご覧のとおり、F#で引数を渡すことは可能です。しかし、私たちのいくつかが指摘しているように、これは関数型プログラミングの共通のイディオムとは非常に反対です。それ自体が間違っていない - まれです。 –

+0

cookyaあなたはStackOverflowを初めて使うかもしれないので、一般的には左の投票数の下のチェックマークをクリックして回答を受け入れることができます。そうすれば、他の人があなたの質問と答えを見ると、彼らはあなたの質問に対する最良の答えと考える考えがあります。 –

答えて

2

&演算子とbyrefキーワードを使用できます。

let func1 = 
    … 
    func2 (&x) 
    … 

let func2 (x : int byref) = 
    … 

詳細については、MSDN: Reference cells (F#)を参照してください。

+0

ありがとうございます! – cookya

1

あなたは基準セルを使用することができます。

let func1 ref = 
    ref := !ref+1 

let func2() = 
    let x = ref 1 
    func1 x 
    System.Console.WriteLine(!x) 

が、それは、C#から物事

2

これらの種類の厳格な翻訳を行うには関数型言語では(穏やかにそれを置くために)「ベストプラクティス」ではありませんスタイルコードは次のようになります。

let func2 (x : byref<_>) = 
    x <- x + 1 

let func1 = 
    let mutable x = 1 
    func2 &x 
    System.Console.WriteLine(x) 

しかし、参考にしておくことを強くお勧めします。

編集:(コメントを参照してください)指摘されたとして、あなたはおそらく、関数func1が関数になることを意味:

let func2 (x : byref<_>) = 
    x <- x + 1 

let func1() = 
    let mutable x = 1 
    func2 &x 
    System.Console.WriteLine(x) 
+0

"<_>"は何を表していますか? – cookya

+0

遅延ジェネリック。これは、F#の型推論が何を想定しているかを推測することを意味します( 'int'を推測するので、xの型は' byref 'です)。 –

+0

私は 'func1'の後に'() 'が必要だと思います - 今は関数ではなく値であるため宣言されています。 – MiMo

2

何を求めていることは可能ですが、それはかなりの反対ですF#が奨励する機能的アプローチ。

let func2 x = 
    x + 1 

let func1() = 
    let x = 1 
    let y = func2 x 
    System.Console.WriteLine(y) 

これは、関数型プログラミング(とF#)でこの種のものを行うにはより多くの慣用的な方法がある:あなたがこれを行うことはできませんいくつかの強力な理由があります。それとも、このことについてどのように、その後のxを変異させる必要がある場合:ところで

let func2 x = 
    x + 1 

let func1() = 
    let mutable x = 1 
    x <- func2 x 
    System.Console.WriteLine(x) 

、F#で、func2のは、それが使われている前に定義する必要があります。

+0

実際に関数であることを宣言に 'func1'で' '() – MiMo

+0

あなたは正しい - 私の悪いです。コードが修正されました。 –

関連する問題