Frage

Mit einer Reihe let foo = [|1;2;3;4|] ich eine der folgenden verwenden, um eine Scheibe aus einem Array zurück.

foo.[..2] 
foo.[1..2] 
foo.[2..]

Wie kann ich die gleiche Sache für List let foo2 = [1;2;3;4] tun? Wenn ich die gleiche Syntax wie das Array versuchen bekomme ich error FS00039: The field, constructor or member 'GetSlice' is not defined.

Was ist das bevorzugte Verfahren zur Herstellung eines Teilabschnitt einer Liste bekommen und warum sind sie nicht gebaut GetSlice zu unterstützen?

War es hilfreich?

Lösung

  

Was ist die bevorzugte Methode des Erhaltens   ein Teilabschnitt einer Liste und warum nicht   gebaut GetSlice zu unterstützen?

Lassen Sie uns die letzte Frage zuerst und die erste Frage zuletzt:

Warum Listen nicht unterstützen GetSlice

Die Listen werden als verkettete Listen implementiert, so haben wir nicht effizient indexierten Zugang zu ihnen. Vergleichsweise, foo.[|m..n|] nimmt O(n-m) Zeit für Arrays, eine äquivalente Syntax nimmt O(n) Zeit auf Listen. Das ist eine ziemlich große Sache, weil es uns von der Verwendung Slicing verhindert Syntax effizient in der überwiegenden Mehrheit der Fälle, in denen es sinnvoll wäre.

Zum Beispiel können wir ein Array in gleich große Stücke in linearer Zeit zerschneiden:

let foo = [|1 .. 100|]
let size = 4
let fuz = [|for a in 0 .. size .. 100 do yield foo.[a..a+size] |]

Aber was ist, wenn wir eine Liste mit anstelle? Jeder Aufruf von foo.[a..a+size] würde länger und länger und länger, die ganze Operation ist O(n^2), so dass es ziemlich ungeeignet für den Job.

Die meisten der Zeit, eine Liste Schneiden ist der falsche Ansatz. Wir normalerweise Musterabgleich verwenden, um Listen zu durchqueren und zu manipulieren.

Bevorzugte Methode für eine Liste Aufschneiden?

Wo immer möglich, verwenden Sie Pattern-Matching, wenn Sie können. Andernfalls können Sie auf Seq.skip und Seq.take für Sie zu zerschneiden Listen und Sequenzen zurückgreifen:

> [1 .. 10] |> Seq.skip 3 |> Seq.take 5 |> Seq.toList;;
val it : int list = [4; 5; 6; 7; 8]

Andere Tipps

F # 4.0 ermöglicht Slicing Syntax für Listen ( link ).

Rationale ist hier :

  

Der F # Listentyp unterstützt bereits ein Index-Operator, xs. [3]. Dies ist trotz der Tatsache gemacht, dass die Listen sind verkettete Listen in F # -. Listen werden nur so häufig in F # verwendet, dass in F # 2.0 wurde beschlossen, dies zu unterstützen

     

Da eine Index-Syntax unterstützt wird, macht es Sinn, auch die F # Slicing-Syntax zu unterstützen, z.B. xs. [3..5]. Es ist sehr seltsam zu haben, um einen Array-Typen zu verwenden Schneiden zu wechseln, aber Sie müssen nicht, dass der Schalter für die Indizierung machen.

Dennoch Juliet Antwort, das zu sagen, die meiste Zeit eine Liste Schneiden ist der falsche Ansatz, nach wie vor gilt. So klug sein, wenn diese Funktion verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top