【问题标题】:Why there is no List.skip and List.take?为什么没有 List.skip 和 List.take?
【发布时间】:2010-12-03 00:41:34
【问题描述】:

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

但这仍然不能回答问题...

【问题讨论】:

  • List.skip 不需要创建新列表,但 List.take 会。

标签: list f# sequences


【解决方案1】:

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

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

【讨论】:

  • 很好的答案,但 n 的值为负。这总是返回一个空列表而不是相同的。替代方案:让 rec 跳过 n xs = if 0
【解决方案2】:

未来的List.skip 1 被称为List.tail,您只需将tail 加入列表n 次。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多