Szukaj…


Odwrócenie listy dowolnego typu

Aby odwrócić listę, nie jest ważne, jakiego typu są elementy listy, tylko w jakiej są kolejności. Jest to idealny kandydat na funkcję ogólną, więc można używać tej samej funkcji odwrotności bez względu na to, jaka lista zostanie przekazana.

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

Kod nie przyjmuje żadnych założeń dotyczących typów elementów. Kompilator (lub interaktywny F #) powie ci, że podpis typu tej funkcji to 'T list -> 'T list Litera 'T informuje, że jest to typ ogólny, bez żadnych ograniczeń. Możesz również zobaczyć 'a zamiast 'T - litera jest nieważna, ponieważ jest tylko ogólnym symbolem zastępczym. Możemy przekazać int list lub int list string list i oba będą działać pomyślnie, zwracając odpowiednio int list lub string list .

Na przykład w interaktywnym F #:

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

Mapowanie listy na inny typ

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

Podpis tej funkcji to ('a -> 'b) -> 'a list -> 'b list , która jest najbardziej ogólna z możliwych. Nie zapobiega to temu, że 'a jest tego samego typu co 'b , ale pozwala im również być różnym. Tutaj widać, że 'a typ, który jest parametrem funkcji f musi pasować do typu parametru list . Ta funkcja jest nadal ogólna, ale na danych wejściowych występują pewne niewielkie ograniczenia - jeśli typy nie pasują, wystąpi błąd kompilacji.

Przykłady:

> 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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow