gpt4 book ai didi

list - 从F#中的列表中切片类似的功能

转载 作者:行者123 更新时间:2023-12-03 13:41:08 25 4
gpt4 key购买 nike

使用数组let foo = [|1;2;3;4|]时,我可以使用以下任意项从数组返回切片。

foo.[..2] 
foo.[1..2]
foo.[2..]


如何为列表 let foo2 = [1;2;3;4]做同样的事情?当我尝试与数组相同的语法时,得到 error FS00039: The field, constructor or member 'GetSlice' is not defined.

获取List子节的首选方法是什么?为什么不构建它们以支持GetSlice?

最佳答案

什么是首选的获取方法
列表的一个小节,为什么不
为支持GetSlice而构建?


让我们首先讨论最后一个问题,最后讨论第一个问题:

为什么列表不支持GetSlice

列表是作为链接列表实现的,因此我们没有对它们进行有效的索引访问。相对而言,foo.[|m..n|]花费数组的O(n-m)时间,等效语法花费列表上的O(n)时间。这是一个很大的问题,因为它使我们无法在大多数有用的情况下有效使用切片语法。

例如,我们可以在线性时间内将数组切成相等大小的片段:

let foo = [|1 .. 100|]
let size = 4
let fuz = [|for a in 0 .. size .. 100 do yield foo.[a..a+size] |]


但是,如果我们改用列表呢?每次对 foo.[a..a+size]的调用将花费越来越长的时间,整个操作为 O(n^2),因此非常不适合该工作。

在大多数情况下,切片列表是错误的方法。我们通常使用模式匹配来遍历和操作列表。

切片列表的首选方法?

尽可能使用模式匹配。否则,您可以依靠 Seq.skipSeq.take为您剪切列表和序列:

> [1 .. 10] |> Seq.skip 3 |> Seq.take 5 |> Seq.toList;;
val it : int list = [4; 5; 6; 7; 8]

关于list - 从F#中的列表中切片类似的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1984416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com