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'