Suche…


Umkehrung einer Liste eines beliebigen Typs

Um eine Liste umzukehren, ist es nicht wichtig, um welchen Typ es sich bei den Listenelementen handelt, sondern nur um die Reihenfolge, in der sie sich befinden. Dies ist der perfekte Kandidat für eine generische Funktion, sodass dieselbe Reverseal-Funktion unabhängig von der übergebenen Liste verwendet werden kann.

let rev list =
    let rec loop acc = function
        | []           -> acc
        | head :: tail -> loop (head :: acc) tail
    loop [] list

Der Code macht keine Annahmen über die Arten der Elemente. Der Compiler (oder F # interactive) teilt Ihnen mit, dass die Typunterschrift dieser Funktion 'T list -> 'T list . Das 'T sagt Ihnen, dass es sich um einen generischen Typ ohne Einschränkungen handelt. Möglicherweise wird auch 'a anstelle von 'T angezeigt. Der Buchstabe ist unwichtig, da er nur ein allgemeiner Platzhalter ist. Wir können eine int list oder eine string list , und beide funktionieren erfolgreich und geben eine int list bzw. eine string list zurück.

Zum Beispiel in F # interactive:

> let rev list = ...
val it : 'T list -> 'T list
> rev [1; 2; 3; 4];;
val it : int list = [4; 3; 2; 1]
> rev ["one", "two", "three"];;
val it : string list = ["three", "two", "one"]

Eine Liste einem anderen Typ zuordnen

let map f list =
    let rec loop acc = function
        | []           -> List.rev acc
        | head :: tail -> loop (f head :: acc) tail
    loop [] list

Die Signatur dieser Funktion ist ('a -> 'b) -> 'a list -> 'b list Dies ist die generischste. Dies verhindert nicht, dass 'a derselbe Typ ist wie 'b , aber es lässt auch zu, dass sie verschieden sind. Hier können Sie sehen , dass das 'a Typ, der die Parameter der Funktion ist f müssen die Art des Spiels list Parameter. Diese Funktion ist immer noch generisch, es gibt jedoch einige Einschränkungen für die Eingaben. Wenn die Typen nicht übereinstimmen, tritt ein Kompilierungsfehler auf.

Beispiele:

> let map f list = ...
val it : ('a -> 'b) -> 'a list -> 'b list
> map (fun x -> float x * 1.5) [1; 2; 3; 4];;
val it : float list = [1.5; 3.0; 4.5; 6.0]
> map (sprintf "abc%.1f") [1.5; 3.0; 4.5; 6.0];;
val it : string list = ["abc1.5"; "abc3.0"; "abc4.5"; "abc6.0"]
> map (fun x -> x + 1) [1.0; 2.0; 3.0];;
error FS0001: The type 'float' does not match the type 'int'


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