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'