Подтвердить что ты не робот

Почему нет List.skip и List.take?

Почему нет List.skip и List.take? Конечно, Seq.take и Seq.skip, но в результате они не создают списки.

Одно из возможных решений: mylist | > Seq.skip N | > Seq.toList Но это создает первый счетчик, а затем новый список из этого перечислителя. Я думаю, что может быть более прямой способ создания неизменяемого списка из непреложного списка. Поскольку внутри копии нет элементов внутри, есть только ссылки из нового списка на оригинальный.

Другое возможное решение (без исключений):

let rec listSkip n xs = 
    match (n, xs) with
    | 0, _ -> xs
    | _, [] -> []
    | n, _::xs -> listSkip (n-1) xs

Но это еще не ответит на вопрос...

4b9b3361

Ответ 1

Будущий List.skip 1 называется List.tail, вы можете просто tail в списке n раз.

List.take должен был бы создать новый список в любом случае, так как можно использовать общие суффиксы неизменяемого списка.

Ответ 2

BTW, вы можете добавить свои функции в модуль List:

module List =
   let rec skip n xs = 
      match (n, xs) with
      | 0, _ -> xs
      | _, [] -> []
      | n, _::xs -> skip (n-1) xs