2次元配列の基本関数を書いています。"set" 関数の書き方には 2 つの方法があります。1 つ目は、行列のコピーを作成してから変更することです。
let copy_matrix (m: 'a array array): 'a array array =
let l = Array.length m in
if l = 0 then m else
let result = Array.make l m.(0) in
for i = 0 to l - 1 do
result.(i) <- Array.copy m.(i)
done;
result
let set_copy (m: 'a array array) (r: int) (c: int) (v: 'a): 'a array array =
let m' = copy_matrix m in
m'.(r).(c) <- v;
m'
2 つ目は、マトリックスを直接変更するだけです。
let set (m: 'a array array) (r: int) (c:int) (v: 'a) : unit =
m.(r).(c) <- v
それが Java の場合、2 番目の関数が最初の関数よりも高速で経済的であることは明らかだと思います。しかし、誰かが (私は忘れました) 私に、1) OCaml のメモリ管理はset_copy
非常にスマートで、あまりコストがかからないこと、2) よりも使用する方が良いいくつかの理由 (忘れていました) があることをset_copy
教えてくれましたset
。
これが本当かどうか誰か教えてもらえますか?