元素列表的子集

时间:2016-02-02 14:39:44

标签: f#

我需要从F#中第一次出现的元素中获取列表的子集。我使用一个简单的递归例程实现了这个,如下所示:

// Returns a subset of a list from the first occurrence of a given item
// e.g. ignoreUpTo "B" ["A";"B";"C";"D"] yields ["C"; "D"]

let rec ignoreUpTo item l  = 
  match l with
  | hd::tl -> if hd = item then tl else ignoreUpTo item tl 
  | _ -> []

这适用于我的需求,但我想知道是否有更好的方法使用F#语言中的现有List函数来完成此操作。

2 个答案:

答案 0 :(得分:4)

如果你正在使用F#4,那么现在有一个List.skipWhile功能;在F#4之前,skipWhile函数仅在seq上可用。所以你可以写:

let ignoreUpTo item l =
  l
  |> List.skipWhile ((<>) item)
  |> List.skip 1  // Because otherwise you'll get ["B"; "C"; "D"]

如果您使用的是F#3.1或更早版本,则需要先将您的列表转换为seq

let ignoreUpTo item l =
  l
  |> List.toSeq
  |> Seq.skipWhile ((<>) item)
  |> Seq.skip 1  // Because otherwise you'll get ["B"; "C"; "D"]
  |> Seq.toList  // Optional, if you can get by with a seq instead of a list

答案 1 :(得分:3)

您可以使用List.skipWhile来实现它。如果列表中没有任何元素与项目相同,我假设您要返回空列表。

let ignoreUpTo item l =
    match List.skipWhile ((<>) item) l with
    | [] -> []
    | x :: xs -> xs 
相关问题