0

配列を扱うときは、のようmyArray.[i]に使用する必要があることについて読みましたが、私の経験からmyArray[i]もコンパイルします。

ただし、.Netの配列に書き込みたい場合(つまり、変更可能)、これはエラーになります let myArray.[i] = 3が、let myArray[i] =3機能します。

そのようなことに対処するためのベストプラクティスは何ですか?

また、使用する必要がありますかArray.get、それとも使用する必要があります.[]か?

ジャグ配列に値を設定するにはどうすればよいですか?let myArray.[i].[j] = 5

4

3 に答える 3

5

1)配列セルに値を割り当てる場合は、代入演算子を使用します<-

myArray.[i] <- 3 

2)コンパイラがそれを引数としてリストを持つ関数let myArray[i] = 3として理解し、を返すため、コンパイルします。警告と型署名を読むと、間違っていることがわかります。myArray3

3)Array.getへの単一の呼び出し.[]です。Array.get関数の合成や型の注釈の回避に便利な場合があります。たとえば、あなたは

let mapFirst arrs = Array.map (fun arr -> Array.get arr 0) arrs 

対。

let mapFirst arrs = Array.map (fun (arr: _ []) -> arr.[0]) arrs
于 2012-09-06T16:56:52.750 に答える
4

どちらのアプローチも正しくありません。あなたが次のようないくつかの定義を持っていると仮定します

let myArray = [| 1; 7; 15 |]
let i = 2

実際に必要なのは次のようなものです。

myArray.[i] <- 3

あなたが書くとき

let myArray[i] = 3

実際には、整数リストを受け取り、整数を返す関数myArrayを定義しています。これはあなたが望むものではありません。

于 2012-09-06T16:56:27.997 に答える
2

ここでの問題は、let式の中に配列代入を埋め込もうとしていることです。式let myArray[3] = 2は配列への割り当てではありません。むしろ、それは関数の定義です。fsiで何が起こるかを見てください:

let myArray[i] = 3;;
val myArray : int list -> int

(実際にはそこにも警告があります)。別の方法でフォーマットすると、この事実も明らかになりますlet myArray [3] = 2

他の人が指摘しているように、.[]配列アクセス用であり、配列に割り当てるには、myArray.[i] <- 3(let式内ではなく)を使用します。

于 2012-09-06T17:03:56.747 に答える