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