Jede ernsthafte Programmierung in einer beliebigen Sprache enthält immer Listen. Daher werden Sie erfreut sein zu wissen, dass F # Listen mit seinem List-Modul sehr, sehr gut unterstützt. Eine Liste in F # ist eine geordnete, unveränderliche Reihe von Elementen desselben Typs.
Erstellen Sie eine Liste
In F # gibt es verschiedene Möglichkeiten, eine Liste zu erstellen.
- Erstellen Sie eine leere Liste
- Erstellen Sie eine einfache Liste mit Elementen von 1 bis 10
- Erstellen Sie eine Liste mit ungeraden Zahlen im Bereich von 1 bis 10
- Verwenden Sie die for-Schleife, um eine Liste zu erstellen.
let prettyPrint desc list = printfn desc printfn "%A" list //empty list let listEmpty = [] //simple list let list1 = [1 .. 10 ] //simple list, with step value let list2 = [1 ..2..10 ] //using for loops to create lists let list3 = [for i in 1 .. 10 -> i*2 ] prettyPrint "let listEmpty = []" listEmpty prettyPrint "let list1 = [ 1 .. 10 ]" list1 prettyPrint "let list2 = [ 1 .. 2..10 ]" list2 prettyPrint "[ for i in 1 .. 10 -> i*2 ]" list3

Das letzte oben gezeigte Beispiel zeigt, wie Sie mit der for-Schleife eine Liste erstellen, was sehr cool ist, aber die F # -Toolbox enthält noch etwas Cooleres und Leistungsfähigeres, nämlich Listenverständnisse.
Listenverständnis ist eine leistungsstarke Methode, mit der Sie Listen mit der Standard-F # erstellen können, die Funktionen / Schleifen / Bedingungen usw. enthält.
Schauen wir uns weiterhin ein Beispiel an, wie wir Listen erstellen können.
let is2 x = match x with | 2 -> "YES" | _ -> "NO" //yield directly let list1 = [ yield 1; yield 2; yield 3; ] //yield numbers between 1 and 20 where we use the //Math.Pow function to return a new number let list2 = [for i in 1.0 .. 20.0 do yield Math.Pow(i,2.0) ] //yield only numbers between 1 and 20 that //can be divided by 5 let list3 = [ for i in 1 .. 20 do if i

Einige nützliche Listenoperatoren
Nachteile Operator
Wir können den Nachteile-Operator "::" verwenden, um einer vorhandenen Liste Werte hinzuzufügen. Nehmen wir also an, wir hätten diese Liste:
let list1 = [1;2;3;4] let list2 = 42 :: list1

Verkettungsoperator
Ein weiterer sehr nützlicher Operator ist der Operator "@", mit dem Sie Listen desselben Typs kombinieren können. Wenn wir zum Beispiel folgendes hätten:
let list1 = [1;2;3;4] let list2 = [5;6;7;8] let list3 = list1 @ list2

Listenmodul
Ich glaube nicht, dass ich es übertreibe, wenn ich sage, dass das Listenmodul ein Schlüsselmodul in F # ist. Tatsächlich ist die MSDN-Dokumentation dafür im Vergleich zu anderen in F # sehr gut. Daher glaube ich nicht, dass ich den Beispielen auf MSDN viel Nützliches hinzufügen kann, aber ich werde hier einige zur Vereinfachung geben,
aber Sie sollten MSDN studieren, um weitere Informationen zu erhalten .
Die Eigenschaften
Head
'T
Erstes Element
Empty
'T list
Gibt eine leere Liste des angegebenen Typs zurück
IsemptyBooltrue - wenn die Liste keine Elemente enthält
Artikel'T.
Ein Element, das sich in einem bestimmten Index befindet
LängeintAnzahl der Artikel
Schwanz'T Liste
Liste ohne ersten Punkt:
let list1 = [ 1; 2; 3 ] // Properties printfn "list1.IsEmpty is %b" (list1.IsEmpty) printfn "list1.Length is %d" (list1.Length) printfn "list1.Head is %d" (list1.Head) printfn "list1.Tail.Head is %d" (list1.Tail.Head) printfn "list1.Tail.Tail.Head is %d" (list1.Tail.Tail.Head) printfn "list1.Item(1) is %d" (list1.Item(1))

Filter
Gibt eine neue Sammlung zurück, die nur die Elemente der Sammlung enthält, für die das angegebene Prädikat true zurückgibt. Hier ist ein einfaches Beispiel, bei dem nur gerade Zahlen aus einer Liste ausgewählt werden, um eine neue Liste zu erstellen
let evenOnlyList = List.filter (fun x -> x

Suchen (finden)
Gibt das erste Element zurück, für das diese Funktion true zurückgibt. In diesem Beispiel ist 5 die 1. Zahl, die durch 5 geteilt wird, da die Liste von 1 bis 100 5 enthält. Dies ist also der Rückgabewert:

Für alle (für alle)
Überprüft, ob alle Elemente in der Sammlung ein bestimmtes Prädikat erfüllen. In diesem Beispiel muss die gesamte Liste 0 enthalten, um den wahren Rückgabewert zu erhalten.
let isAllZeroes list = List.forall (fun elem -> elem = 0.0) list printfn "%b" (isAllZeroes [0.0; 0.0]) printfn "%b" (isAllZeroes [0.0; 1.0])

Auf alle anwenden (Iteri)
Wendet diese Funktion auf jedes Element in der Sammlung an. Die an die Funktion übergebene Ganzzahl gibt den Index des Elements an.
let data = ["Cats";"Dogs";"Mice";"Elephants"] data |> List.iteri (fun ix -> printfn "item %d: %s" ix)

Sortieren nach (SortWith)
Sortiert die angegebene Liste mit dieser Vergleichsfunktion.
let list1 = [ ""; "&"; "&&"; "&&&"; ""; "|"; "||"; "|||" ] printfn "Before sorting: " list1 |> printfn "%A" //custom sorting function let sortFunction (string1:string) (string2:string) = if (string1.Length > string2.Length) then 1 else if (string1.Length printfn "After sorting:\n%A"

Das Listenmodul enthält viele nützliche Funktionen. Dies ist nur ein kleiner Teil dessen, was Sie finden können.
Ein kleiner Blick auf die Rekursion über Listen
Keine Diskussion von Listen wäre vollständig, ohne über Rekursion zu sprechen. Rekursion ist das, worum es im gesamten Beitrag geht, aber schauen wir uns zunächst an, was zum Schreiben einer rekursiven Funktion erforderlich ist, die für eine Liste in F # funktioniert.
let printIt desc x = printfn "%A %A" desc x let rec printList list = match list with | h :: t -> printIt "head=" h printIt "tail=" t printList t | [] -> () printList [1;2;3;4;5]
Beachten Sie die Verwendung des Schlüsselworts
rec , das dem F # -Compiler mitteilt, dass diese Funktion rekursiv ist. Ohne dieses Schlüsselwort ein rekursiver Funktionsaufruf - Sie erhalten eine Kompilierungsfehlermeldung, allerdings mit einem nicht sehr klaren Fehlertext.

Schauen wir uns also die Ergebnisse des Beispiels mit der folgenden Liste etwas höher an [1; 2; 3; 4; 5]

Sie können sehen, dass alles einwandfrei funktioniert und nicht mehr funktioniert, wenn der Wert erwartungsgemäß mit einer leeren Liste übereinstimmt.