В зависимости от вашей ситуации вам может понадобиться или нет необходимость отслеживать, с каким типом коллекций вы имеете дело.
В случае простой перебора элементов ничто не может помешать вам использовать Seq.iter
в спискахили массивы в F #: он будет работать как с массивами, так и со списками, поскольку оба они также являются последовательностями или IEnumerable
s с точки зрения .NET.Использование Array.iter
над массивом или List.iter
над списком просто предложит более эффективные реализации обхода, основанные на конкретных свойствах каждого типа коллекции.Как показывает сигнатура Seq.iter Seq.iter : ('T -> unit) -> seq<'T> -> unit
, вам не важен ваш тип 'T
после обхода.
В других ситуациях вы можете рассмотреть типы входных и выходных аргументов и использовать специализированные функции,если вы заботитесь о дальнейшей композиции.Например, если вам нужно отфильтровать список и продолжить использовать результат, то
List.filter : ('T -> bool) -> 'T list -> 'T list
сохранит вам тип базовой коллекции без изменений, но применение Seq.filter : ('T -> bool) -> seq<'T> -> seq<'T>
к списку вернет вам последовательность,больше нет списка:
let alist = [1;2;3;4] |> List.filter (fun x -> x%2 = 0) // alist is still a list
let aseq = [1;2;3;4] |> Seq.filter (fun x -> x%2 = 0) // aseq is not a list anymore