我想从嵌套列表中删除第一个元素。我刚刚了解了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]]))
我知道他们俩都错了,我只是想表明我至少在尝试,而不仅仅是要求快速获得答案。
致谢
答案 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