Ответ 1
Будущий List.skip 1
называется List.tail
, вы можете просто tail
в списке n раз.
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
Но это еще не ответит на вопрос...
Будущий List.skip 1
называется List.tail
, вы можете просто tail
в списке n раз.
List.take
должен был бы создать новый список в любом случае, так как можно использовать общие суффиксы неизменяемого списка.
BTW, вы можете добавить свои функции в модуль List:
module List =
let rec skip n xs =
match (n, xs) with
| 0, _ -> xs
| _, [] -> []
| n, _::xs -> skip (n-1) xs