为什么没有List.skip和List.take?

时间:2010-12-02 10:13:20

标签: list f# sequences

为什么没有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 个答案:

答案 0 :(得分:12)

顺便说一句,你可以将你的功能添加到列表模块:

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

答案 1 :(得分:10)

想成为List.skip 1的人称为List.tail,您只需tail进入列表 n 次。

无论如何,

List.take必须创建一个新列表,因为只能共享不可变列表的常见后缀。