我遇到了一个分配的问题,我必须创建一个函数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
的初始空表。
答案 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已经回答了几乎相同的问题,但是我认为您可能会从更具体的代码修复示例中受益。