単純すぎるかもしれませんが、F# ( C#
のように) で値をインクリメントしようとしている Web で答えが見つかりません。
「mutable」オプションを使用したくありません。F# のインクリメント関数がどのように見えるべきかの例を見たいだけです。
そして、どうやってそれを使うのですか。count++
3 に答える
C++ と同じ意味での「値をインクリメントする」という考え方は、変更可能な値を操作している場合、または変更可能な参照セル (基本的に変更可能な値を格納する単純なオブジェクト) を使用している場合にのみ意味があります。変更可能な参照セルがある場合は、次のincr
関数を使用できます。
let count = ref 0
incr count
可変変数を使用する場合、これには組み込み関数がなく、次のように記述する必要がありますcount + 1
。
let mutable count = 0
count <- count + 1
不変値を使用してコードを記述している場合は、通常、記述count + 1
して結果を関数 (または別の場所 - これは特定のケースによって異なります) に渡します。たとえば、F# リストの長さを計算するには、次のように記述します。
let rec length list =
match list with
| [] -> 0
| _::tail -> 1 + (length tail)
この例では、式は、リストを反復処理してその長さを計算する C++ コードに1 + (...)
対応するコードです。i++
式の結果は、length
関数の結果として直接返されるため、新しい変数に割り当てられません。
EDIT関数のパラメータは不変です。つまり、値を変更することはできません。Lee が述べたように、変数のシャドウイングを使用して古い値を新しい値で隠すことができますが、これはローカルな効果しかないことに注意してください (新しい値を格納するために別の名前で新しい変数を定義するようなものです)。例えば:
let rec length list count =
match list with
| [] -> count
| _::tail ->
let count = count + 1 // Variable shadowing used here
length tail count
行を単純化する関数を書くことはできません。let count = count + 1
前述のように、これは最後の行で書いlet newCount = count + 1
てから使用することと同じです。newCount
ポストインクリメント演算子をシミュレートすることはできませんが、プリインクリメントを行うことはできます
let inline (+=) (x : byref<_>) y = x <- x + y
let mutable a = 0
&a += 1
また
let inline incv (x : byref<_>) = x <- x + LanguagePrimitives.GenericOne; x
let mutable b = 0
incv &b
mutable を使用したくない場合++
は、C# のように破壊的な更新を行うことはできません。同じ名前の新しい変数で変数をシャドウできます。
let x = 4;
let x = x + 1 in (x+4) //returns 8
これを関数として書くことはできませんでしたが。
編集: 変更可能な変数を使用したい場合は、refを変更する関数を作成できます:
let increment (ir: int ref) = ir := !ir + 1
その後、次のように使用できます
let i = ref 1
increment i
let iv = !i //iv contains 2
Tomas が回答で指摘しているように、この関数は既に存在し、 と呼ばれていincr
ます。