2010-05-25 10 views
14

Was ist der Unterschied zwischen 'a[,,] und 'a[][][]? Sie repräsentieren beide 3-d-Arrays. Es macht mich array3d.[x].[y].[z] statt array3d.[x, y, z] schreiben.F # Multidimensionale Array-Typen

Warum kann ich Folgendes nicht tun?

> let array2d : int[,] = Array2D.zeroCreate 10 10;; 
> let array1d = array2d.[0];; 

error FS0001: This expression was expected to have type 
    'a []  
but here has type 
    int [,] 

Antwort

32

Der Unterschied besteht darin, dass 'a[][] ein Array von Arrays darstellt (von möglicherweise unterschiedlichen Längen), während in 'a[,], eine rechteckige Anordnung 2D darstellt. Der erste Typ wird auch gezackte Arrays genannt und der zweite Typ heißt mehrdimensionale Arrays. Der Unterschied ist der gleiche wie in C#. Daher sollten Sie sich die C# -Dokumentation für jagged arrays und multidimensional arrays ansehen. Es gibt auch eine hervorragende Dokumentation in der F# WikiBook.

Um dies zu zeigen, ein Bild mit, kann ein Wert vom Typ 'a[][] wie folgt aussehen:

0 1 2 3 4 
5 6 
7 8 9 0 1 

Während ein Wert vom Typ a[,] wird immer ein Rechteck sein und wie dies zum Beispiel aussehen:

0 1 2 3 
4 5 6 7 
8 9 0 1 

Um eine einzelne „Linie“ eines mehrdimensionalen Arrays zu erhalten, können Sie die Slice-Notation:

let array1d = array2d.[0..0,0..9];; 

Scheiben tatsächlich mehrdimensionales Array zurück (in diesem Fall mit einer Dimension gleich 1), so dass man eine Konvertierungsfunktion, die wie folgt 'a[] kehrt schreiben kann:

let toArray (arr:_[,]) = 
    Array.init arr.Length (fun i -> arr.[0, i]) 

let array1d = array2d.[0..0,0..9] |> toArray;;