删除F#嵌套列表中的第一个元素?

时间:2018-10-03 17:55:45

标签: f#

我想从嵌套列表中删除第一个元素。我刚刚了解了List.map和List.filter,但无法使其正常工作。

所以[[1; 2; 3]; [4; 5; 6]]变为[[2; 3]; [5; 6]

有人可以向我暗示正确的方向吗?

版本1:

let remove l =

for i in l do
    printfn "i %A" i
    for j in i do 
        printfn "%A" j
        List.map (fun x -> x) j


printfn "done"


printfn "%A" (remove ([[1;2;3]; [4;5;6]]))

版本2:

let remove1 l = 

  for i in l do
     printfn "i %A" i
     List.map (fun x -> x.[2..]) j


printfn "%A" (remove1 ([[1;2;3]; [4;5;6]]))

我知道他们俩都错了,我只是想表明我至少在尝试,而不仅仅是要求快速获得答案。

致谢

2 个答案:

答案 0 :(得分:2)

因此,您有一个列表列表,并且想要删除每个子列表的第一个元素。如果我们假设所有子列表至少包含一个元素,则可以在每个子列表上使用List.tail以获取其尾部(即没有第一个元素的列表),然后将其用作映射器函数,通过List.map

let removeFirst = List.map List.tail

是的,真的很简单!

答案 1 :(得分:1)

您使用的是for ... do,但这是用于命令性代码的(例如,对于列表中的每个元素,请执行此副作用)。

您想要的是一个函数,该函数接受一个列表,并返回一个列表,其中每个项目都已转换。 (这里,项目是子列表,转换是“从列表中删除第一项”)。这就是List.map的用途:List.map transformation lst将获取列表lst,对每个项目进行转换,并使用转换后返回的值创建一个新列表。 (转换应该是使用原始项目并返回新值的函数。)

现在,正如我们已经说过的,您要应用的转换是获取一个列表并将其减去第一项返回。那可以表示为fun lst -> List.tail lst,因此您的地图看起来像List.map (fun innerList -> List.tail innerList) outerList。但是,只要您看到fun x -> someFun x,该表达式就可以简单地用someFun代替。这样List.map调用就变得简单了:

List.map List.tail outerList

或者,表示为函数:

let removeFirst outerList = List.map List.tail outerList

在这里我们可以使用一种称为“无点”样式的编程样式(除非您熟悉lambda演算,否则“无点”名称可能会造成混淆,因此可以将其视为“无参数”样式)以进一步简化该表达式:

let removeFirst = List.map List.tail

因此,我们到达了@dumetrulo发布的(相当正确的)解决方案。但是,对于初学者来说,“无点”样式可能会造成混淆,因此,我建议您对参数进行更明确的说明,以便以后阅读此代码时,您会意识到removeFirst是一个函数,没有价值。因此,我建议将您的函数编写为:

let removeFirst outerList = List.map List.tail outerList