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

F#:从嵌套列表中的第一个元素创建新列表,f#,F#,我有一个指定的问题,我必须创建一个函数firstColumn:lst:“一个列表->”一个列表,它获取一个列表列表,并使用每个嵌套列表中的第一个元素生成一个新列表。例如,firstColumn[[343;32];[11;75]将返回一个新表[343;11] 到目前为止,我已经尝试使用循环将每个元素的头(嵌套列表中的第一个元素)附加到新列表中: let firstColumn(lst:'a list):'a list= 让newList=[] 为elm在lst do 榆树头::新列表 新名单 但

我有一个指定的问题,我必须创建一个函数
firstColumn:lst:“一个列表->”一个列表
,它获取一个列表列表,并使用每个嵌套列表中的第一个元素生成一个新列表。例如,
firstColumn[[343;32];[11;75]
将返回一个新表
[343;11]

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

let firstColumn(lst:'a list):'a list=
让newList=[]
为elm在lst do
榆树头::新列表
新名单

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

我认为您只是误解了语法(不是太大的误解,但足以得到错误的结果)。 看看这段几乎相似的代码,找出其中的差异:

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

newList基于Robert发布的示例的内爆解决方案运行良好。但是,如果您希望遵循函数样式,那么可以使用递归和模式匹配编写相同的代码:

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

模式
(head::::lst
获取列表,提取第一个列表的头,并将剩余列表作为
lst
提供给您,因此,您可以递归地处理
lst
并将
head
附加到前面作为第一列。

在同一算法中组合功能性代码和命令性代码通常会对您产生不利影响,当然是在您刚开始旅程的时候。函数代码
elm.Head::newList
创建一个新列表,给定的列表是不可变的,但您不会将其分配给任何对象。所以即使这样,你也必须处理一些可变状态。函数方法将使用高阶函数
List.map
,并选择每个嵌套列表的第一个元素。