次のように私はMatrix
モジュールを定義している:どのように影響を与えるためにコピーを作成するのですか?
module Matrix =
struct
type 'a matrix = 'a array array
let make (nr: int) (nc: int) (init: 'a) : 'a matrix =
let result = Array.make nr (Array.make nc init) in
for i = 0 to nr - 1 do
result.(i) <- Array.make nc init
done;
result
let copy (m: 'a matrix) : 'a matrix =
let l = nbrows 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
...
そしてIは、例えばlet mat = Matrix.make 5 5 100
をコードすることができました。 Matrix
モジュールを定義する利点は、そのコンポーネントのタイプを隠すことです。たとえば、私は後で'a list list
またはmap
で行列を定義したいかもしれません。私はこのモジュールを変更する必要がありますが、このモジュールを使用するコードは変更しないでください。私は実現
しかし、一つの問題は、私がしなければlet m1 = m0 in ...
、m1
とm0
が同じ物理アイテムを共有する、ということである:m1
への変更はm0
に影響を与えます。実際には、これはcopy
関数の目的です。しかし、モジュールにいつもをaffectation
と呼ぶようにする方法はありますか?
悪いことは、機能let f (m: 'a matrix) = ...
のためである、m
からf
内の任意の変更がm
にその値過去の外側のパラメータに影響を与えます。 f
を避ける方法はありますか?
おかげで...しかし、私は実際にそれを使用する方法を見ていない... – SoftTimur
行列をコピーする。 matri mのフィールド(x、y)のフィールドを変更する場合は、 'write m x y k'を使用します。あなたが 'm(x)。(y)< - k'をしたいとき – Thomas