Zoeken…


Omkering van een lijst van elk type

Om een lijst om te keren, is het niet belangrijk welk type de lijstelementen zijn, alleen in welke volgorde ze zich bevinden. Dit is een perfecte kandidaat voor een generieke functie, dus dezelfde omgekeerde functie kan worden gebruikt ongeacht welke lijst wordt doorgegeven.

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

De code maakt geen aannames over de soorten elementen. De compiler (of F # interactive) zal u vertellen dat de typeaanduiding van deze functie 'T list -> 'T list . De 'T vertelt je dat het een generiek type is zonder beperkingen. U ziet mogelijk ook 'a plaats van 'T - de brief is onbelangrijk omdat het slechts een generieke tijdelijke aanduiding is. We kunnen een int list of een string list doorgeven, en beide zullen met succes werken, respectievelijk een int list of een string list retourneren.

In F # interactive bijvoorbeeld:

> 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"]

Een lijst toewijzen aan een ander type

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

De handtekening van deze functie is ('a -> 'b) -> 'a list -> 'b list , wat de meest generieke kan zijn. Dit voorkomt niet dat 'a van hetzelfde type is als 'b , maar het stelt ze ook in staat om anders te zijn. Hier kunt u zien dat het 'a type dat de parameter om de functie f het type moet overeenkomen list parameter. Deze functie is nog steeds generiek, maar er zijn enkele kleine beperkingen aan de invoer - als de typen niet overeenkomen, is er een compilatiefout.

Voorbeelden:

> 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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow