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

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

13 голосов
/ 02 декабря 2010

Почему нет 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

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

Ответы [ 2 ]

12 голосов
/ 02 декабря 2010

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

module List =
   let rec skip n xs = 
      match (n, xs) with
      | 0, _ -> xs
      | _, [] -> []
      | n, _::xs -> skip (n-1) xs
10 голосов
/ 02 декабря 2010

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

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

...