14

为什么没有 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

但这仍然没有回答问题......

4

2 回答 2

12

顺便说一句,您可以将函数添加到 List 模块:

module List =
   let rec skip n xs = 
      match (n, xs) with
      | 0, _ -> xs
      | _, [] -> []
      | n, _::xs -> skip (n-1) xs
于 2010-12-02T13:47:29.613 回答
11

准被List.skip 1称为List.tail,你可以只tail进入列表n次。

List.take would have to create a new list anyway, since only common suffixes of an immutable list can be shared.

于 2010-12-02T16:41:34.417 回答