访问列表列表中的第一个元素 [F#]

Accessing the first elements in a list of Lists [F#]

我目前对 F# 很感兴趣,因为它与我以前使用过的所有东西都不一样。我需要访问包含在一个大列表中的每个列表的第一个元素。 如果我假设主列表包含 'x' 个本身包含 5 个元素的列表,那么访问每个第一个元素的最简单方法是什么。

让 listOfLists = [ [1;2;3;4;5]; [6;7;8;9;10]; [11;12;13;14;15]]

我想要的输出是一个包含 [1;6;11]

的新列表

目前我有

let rec firstElements list  =
    match list with
    | list[head::tail] -> 
        match head with
        | [head::tail] -> 1st @ head then firstElements tail

然后对此进行扩展,我将如何获得所有第二个元素?是否最好创建没有第一个元素的新列表(通过使用类似的函数删除它们)然后重新使用相同的函数?

您可以使用map来提取每个子列表的头元素:

let firstElements li =
  match li with [] -> None | h::_ -> Some h

let myfirstElements = List.map firstElements listOfLists

我使用的是 Ocaml 的 speak,对 F# 几乎没有查找,所以这可能不准确,但这个想法适用。

EDIT:您也可以使用 List.head 使它更简洁并且 return 一个 int list 而不是 int option list.但是,如果您点击一个空列表,它会抛出异常。大多数时候,我会避免在这种情况下使用 List.headList.tail

访问列表第一个元素的最简单方法是List.head。因为你有一个列表列表,你只需要List.map这个函数:

let listOfLists = [ [1;2;3;4;5]; [6;7;8;9;10]; [11;12;13;14;15] ]

listOfLists 
|> List.map List.head
//val it : int list = [1; 6; 11]

现在,如果您需要访问其他元素,您可以使用 List.item 或仅使用 xs.[1] 索引到您的列表中。但请记住,对于大型列表,这将是低效的,如果您想快速查找,请使用数组。

listOfLists
|> List.map (List.item 1)
//val it : int list = [2; 7; 12]

有索引:

listOfLists
|> List.map (fun x -> x.[1])