2010-12-02 13 views
12

为什么没有List.skip和List.take?当然有Seq.take和Seq.skip,但它们不会创建列表。为什么没有List.skip和List.take?

一个可能的解决方案是:mylist |> Seq.skip N |> Seq.toList 但是,这会创建第一个枚举器,然后从该枚举器创建一个新列表。我认为可以有更直接的方式从不可变列表创建不可变列表。由于内部不存在元素的复制,因此只有从新列表到原始列表的引用。

其他可能的解决方案(没有出现任何的异常)是:

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

但是,这仍然不能回答这个问题...

+4

`List.skip`不需要创建一个新的列表,但是`List.take`会。 – Benjol 2010-12-02 12:00:00

+0

你是对的! – 2010-12-03 15:04:06

回答

8

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

List.take无论如何都必须创建一个新列表,因为只能共享不可变列表的通用后缀。

11

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

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