1

参照によって関数を呼び出すオプションはありますか?

例: func1 に変数 x があり、それを func2 に送信して変更できるようにしたい場合 (新しい値などを返さずに)

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

let func2 x =
    x <- x + 1

したがって、 func1 を呼び出すと、「2」が出力されます..

出来ますか?もしそうなら、どのように?

ありがとう。

4

4 に答える 4

2

C#スタイルのコードからの厳密な変換は次のようになります。

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)
于 2012-04-25T11:42:07.777 に答える
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 を使用する前に定義する必要があります。

于 2012-04-25T13:42:37.270 に答える
2

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

let func1 =
    …
    func2 (&x)
    …

let func2 (x : int byref) =
    …

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

于 2012-04-25T11:32:02.917 に答える
1

参照セルを使用できます。

let func1 ref = 
  ref := !ref+1

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

しかし、関数型言語でこの種のことを行うのは「ベストプラクティス」ではありません (控えめに言っても)。

于 2012-04-25T11:32:32.123 に答える