F#:从嵌套列表中的第一个元素创建新列表

时间:2019-10-13 15:54:10

标签: f#

我遇到了一个分配的问题,我必须创建一个函数firstColumn : lst : 'a list list -> 'a list,该函数需要一个列表列表,并使用每个嵌套列表中的第一个元素生成一个新列表。例如,firstColumn [[343;32];[11;75]]将返回一个新表[343;11]

到目前为止,我已经尝试使用循环将每个元素的头部(嵌套列表中的第一个元素)附加到新列表中:

let firstColumn (lst : 'a list list) : 'a list =
  let newList = []
  for elm in lst do
    elm.Head :: newList
  newList

但是,这会导致警告FS0020,其中elm.Head :: newList的结果将被忽略,并返回newList的初始空表。

2 个答案:

答案 0 :(得分:1)

基于罗伯特(Robert)发布的示例的强制性解决方案效果很好。但是,如果您想遵循一种功能风格,则可以使用递归和模式匹配来编写相同的东西:

let rec firstColumn lst = 
  match lst with 
  | (head::_) :: lst -> head :: (firstColumn lst)
  | _ -> []

模式(head::_) :: lst获取一个列表列表,提取第一个列表的开头,然后将其余列表作为lst给出,因此您可以递归处理lst并追加{{ 1}}作为第一列。

答案 1 :(得分:0)

我认为您只是误解了语法(没有太多误解,但足以使您得到错误的结果)。 查看这段几乎相似的代码,并找出不同之处:

let firstColumn (lst : 'a list list) : 'a list =
  let mutable newList = []
  for elm in lst do
    newList <- elm.Head :: newList
  List.rev newList

编辑:我意识到Funk已经回答了几乎相同的问题,但是我认为您可能会从更具体的代码修复示例中受益。