Поиск…


Сторнирование списка любого типа

Чтобы отменить список, не важно, какие типы являются элементами списка, только то, в каком порядке они находятся. Это идеальный кандидат на универсальную функцию, поэтому можно использовать ту же самую обратную функцию независимо от того, какой список передан.

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

В коде не делается никаких предположений о типах элементов. Компилятор (или F # interactive) скажет вам, что сигнатура типа этой функции представляет собой 'T list -> 'T list 'T сообщает вам, что это общий тип без ограничений. Вы также можете увидеть 'a вместо 'T - письмо несущественно, потому что это всего лишь общий заполнитель. Мы можем передать int list или int list string list , и оба они будут успешно работать, возвращая int list или string list соответственно.

Например, в 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"]

Отображение списка в другом виде

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

Подписями этой функции является ('a -> 'b) -> 'a list -> 'b list , который является наиболее общим. Это не мешает 'a быть тем же типом, что и 'b , но также позволяет им быть другим. Здесь вы можете видеть, что 'a тип, являющийся параметром функции f должен соответствовать типу параметра list . Эта функция по-прежнему носит общий характер, но есть некоторые небольшие ограничения на входы - если типы не совпадают, будет ошибка компиляции.

Примеры:

> 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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow