Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
628 views
in Technique[技术] by (71.8m points)

f# - Array.create and jagged array

Can't understand the reason of such behavior:

let example count = 
    let arr = Array.create 2 (Array.zeroCreate count)
    for i in [0..count - 1] do
        arr.[0].[i] <- 1
        arr.[1].[i] <- 2
    arr

example 2 |> Array.iter(printfn "%A")

Print:

[|2; 2|]
[|2; 2|]

https://dotnetfiddle.net/borMmO

If I replace:

let arr = Array.create 2 (Array.zeroCreate count)

to:

let arr = Array.init 2 (fun _ -> Array.zeroCreate count)

Everything will work as expected:

let example count = 
    let arr = Array.init 2 (fun _ -> Array.zeroCreate count)
    for i in [0..count - 1] do
        arr.[0].[i] <- 1
        arr.[1].[i] <- 2
    arr

example 2 |> Array.iter(printfn "%A")

Print:

[|1; 1|]
[|2; 2|]

https://dotnetfiddle.net/uXmlbn

I think the reason is the fact that the array - a reference type. But I want to understand why this is happening. Since I didn't expect such results.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

When you write:

let arr = Array.create 2 (Array.zeroCreate count)

You are creating an array where each element is a reference to the same array. This means that mutating a value using arr.[0] also mutates the value in arr.[1] - because the two array elements are pointing to the same mutable array. You end up with:

[| x  ; x |]
      /
 [| 0; 0 |]

When you write:

let arr = Array.init 2 (fun _ -> Array.zeroCreate count)

The provided function is called for each position in the arr array and so you'll end up with different array for each element (and so arr.[0] <> arr.[1]). You end up with:

     [| x ;  y |]
       /       
[| 0; 0 |]   [| 0; 0 |]

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...