Suche…


Syntax

  • [] // eine leere Liste.

    head :: tail // eine Konstruktionszelle, die ein Element, head und eine list, tail enthält. :: heißt Cons-Operator.

    lassen Sie list1 = [1; 2; 3] // Beachten Sie die Verwendung eines Semikolons.

    let list2 = 0 :: list1 // Das Ergebnis ist [0; 1; 2; 3 ]

    let list3 = list1 @ list2 // Das Ergebnis ist [1; 2; 3; 0; 1; 2; 3 ]. @ ist der Append-Operator.

    let list4 = [1..3] // Ergebnis ist [1; 2; 3 ]

    let list5 = [1..2..10] // Ergebnis ist [1; 3; 5; 7; 9]

    Lassen Sie list6 = [für i in 1..10 tun, wenn i% 2 = 1, dann ergibt i] // Ergebnis ist [1; 3; 5; 7; 9]

Grundlegende Listennutzung

let list1 = [ 1; 2 ]
let list2 = [ 1 .. 100 ]

// Accessing an element
printfn "%A" list1.[0]

// Pattern matching
let rec patternMatch aList = 
    match aList with
    | [] -> printfn "This is an empty list"
    | head::tail -> printfn "This list consists of a head element %A and a tail list %A" head tail
                    patternMatch tail

patternMatch list1

// Mapping elements
let square x = x*x
let list2squared = list2
                   |> List.map square
printfn "%A" list2squared 

Berechnung der Gesamtsumme der Zahlen in einer Liste

Durch Rekursion

let rec sumTotal list = 
    match list with
    | [] -> 0 // empty list -> return 0
    | head :: tail -> head + sumTotal tail

Das obige Beispiel sagt: "Schauen Sie sich die list , ist sie leer? Return 0. Ansonsten handelt es sich um eine nicht leere Liste. Es könnte sich also um [1] , [1; 2] , [1; 2; 3] usw. Wenn list [1] ist, binden Sie die Variable head an 1 und tail an [] und führen Sie head + sumTotal tail .

Beispielausführung:

sumTotal [1; 2; 3]
// head -> 1, tail -> [2; 3]
1 + sumTotal [2; 3]
1 + (2 + sumTotal [3])
1 + (2 + (3 + sumTotal [])) // sumTotal [] is defined to be 0, recursion stops here
1 + (2 + (3 + 0)))
1 + (2 + 3)
1 + 5 
6

Ein allgemeinerer Weg, das obige Muster einzukapseln, ist die Verwendung von Funktionsfalten! sumTotal wird so:

let sumTotal list = List.fold (+) 0 list

Listen erstellen

Eine Liste zum Erstellen einer Liste besteht darin, Elemente in zwei eckige Klammern zu setzen, die durch Semikola getrennt sind. Die Elemente müssen den gleichen Typ haben.

Beispiel:

> let integers = [1; 2; 45; -1];;
val integers : int list = [1; 2; 45; -1]


> let floats = [10.7; 2.0; 45.3; -1.05];;
val floats : float list = [10.7; 2.0; 45.3; -1.05]

Wenn eine Liste kein Element enthält, ist sie leer. Eine leere Liste kann wie folgt deklariert werden:

> let emptyList = [];;
val emptyList : 'a list

Anderes Beispiel

Um eine Liste von Bytes zu erstellen, einfach die Ganzzahlen umwandeln:

> let bytes = [byte(55); byte(10); byte(100)];;
val bytes : byte list = [55uy; 10uy; 100uy]

Es ist auch möglich, Funktionslisten, Elemente eines zuvor definierten Typs, Objekte einer Klasse usw. zu definieren.

Beispiel

> type number = | Real of float | Integer of int;;

type number =
  | Real of float
  | Integer of int

> let numbers = [Integer(45); Real(0.0); Integer(127)];;
val numbers : number list = [Integer 45; Real 0.0; Integer 127]

Bereiche

Für bestimmte Elementtypen (int, float, char, ...) ist es möglich, eine Liste nach dem Startelement und dem Endelement zu definieren, wobei die folgende Vorlage verwendet wird:

[start..end]

Beispiele:

> let c=['a' .. 'f'];;
val c : char list = ['a'; 'b'; 'c'; 'd'; 'e'; 'f']

let f=[45 .. 60];;
val f : int list =
  [45; 46; 47; 48; 49; 50; 51; 52; 53; 54; 55; 56; 57; 58; 59; 60]

Sie können auch einen Schritt für bestimmte Typen mit dem folgenden Modell angeben:

[start..step..end]

Beispiele:

> let i=[4 .. 2 .. 11];;
val i : int list = [4; 6; 8; 10]

> let r=[0.2 .. 0.05 .. 0.28];;
val r : float list = [0.2; 0.25]

Generator

Eine andere Möglichkeit zum Erstellen einer Liste besteht darin, sie automatisch mithilfe des Generators zu generieren.

Wir können eines der folgenden Modelle verwenden:

[for <identifier> in range -> expr]

oder

[for <identifier> in range do ... yield expr]

Beispiele

> let oddNumbers = [for i in 0..10 -> 2 * i + 1];; // odd numbers from 1 to 21
val oddNumbers : int list = [1; 3; 5; 7; 9; 11; 13; 15; 17; 19; 21]

> let multiples3Sqrt = [for i in 1..27 do if i % 3 = 0 then yield sqrt(float(i))];; //sqrt of multiples of 3 from 3 to 27
val multiples3Sqrt : float list =
  [1.732050808; 2.449489743; 3.0; 3.464101615; 3.872983346; 4.242640687;    4.582575695; 4.898979486; 5.196152423]

Operatoren

Einige Operatoren können zum Erstellen von Listen verwendet werden:

Nachteile operator:

Dieser Operator :: wird verwendet, um einer Liste ein Kopfelement hinzuzufügen:

> let l=12::[] ;;
val l : int list = [12]

> let l1=7::[14; 78; 0] ;;
val l1 : int list = [7; 14; 78; 0]

> let l2 = 2::3::5::7::11::[13;17] ;;
val l2 : int list = [2; 3; 5; 7; 11; 13; 17]

Verkettung

Die Verkettung von Listen erfolgt mit dem Operator @.

> let l1 = [12.5;89.2];;
val l1 : float list = [12.5; 89.2]

> let l2 = [1.8;7.2] @ l1;;
val l2 : float list = [1.8; 7.2; 12.5; 89.2]


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow