Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么没有List.skip和List.take?_List_F#_Sequences - Fatal编程技术网

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

为什么没有List.skip和List.take?,list,f#,sequences,List,F#,Sequences,为什么没有List.skip和List.take?当然有Seq.take和Seq.skip,但它们不会因此创建列表 一种可能的解决方案是:mylist |>Seq.skip N |>Seq.toList 但这将首先创建一个枚举数,然后从该枚举数创建一个新列表。我认为可以有更直接的方法从不可变列表创建不可变列表。由于没有内部元素的复制,因此只有从新列表到原始列表的引用 其他可能的解决方案(不引发异常)是: 但这仍然不能回答问题…顺便说一句,您可以将您的函数添加到列表模块: module List

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

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

其他可能的解决方案(不引发异常)是:


但这仍然不能回答问题…

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

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

可能的
List.skip 1
称为
List.tail
,您可以将
tail
放入列表n次


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

List.skip
不需要创建一个新列表,但是
List.take
可以。答案很好,但是n的负值。这总是返回一个空列表,而不是相同的列表。备选方案:如果0,则让rec跳过n xs=
module List =
   let rec skip n xs = 
      match (n, xs) with
      | 0, _ -> xs
      | _, [] -> []
      | n, _::xs -> skip (n-1) xs