Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List F中列表中的切片功能#_List_F#_Slice - Fatal编程技术网

List F中列表中的切片功能#

List F中列表中的切片功能#,list,f#,slice,List,F#,Slice,对于数组让foo=[|1;2;3;4 |]我可以使用以下任一方法从数组返回一个切片 foo.[..2] foo.[1..2] foo.[2..] 如何对List让foo2=[1;2;3;4]执行相同的操作?当我尝试与数组相同的语法时,我得到错误FS00039:未定义字段、构造函数或成员“GetSlice”。 获取列表子部分的首选方法是什么?为什么它们不支持GetSlice 你最喜欢的方法是什么 列表的一部分,为什么没有 为支持GetSlice而构建 让我们先问最后一个问题,最后一个问题:

对于数组
让foo=[|1;2;3;4 |]
我可以使用以下任一方法从数组返回一个切片

foo.[..2] 
foo.[1..2] 
foo.[2..]
如何对List
让foo2=[1;2;3;4]
执行相同的操作?当我尝试与数组相同的语法时,我得到
错误FS00039:未定义字段、构造函数或成员“GetSlice”。

获取列表子部分的首选方法是什么?为什么它们不支持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.skip
Seq.take
为您分割列表和序列:

> [1 .. 10] |> Seq.skip 3 |> Seq.take 5 |> Seq.toList;;
val it : int list = [4; 5; 6; 7; 8]
F#4.0将允许列表的切片语法()

理由是:

F#list类型已经支持索引运算符xs.[3]。尽管列表在F#中是链表,但这一点仍然存在——列表在F#中非常常用,以至于在F#2.0中决定支持这一点

由于支持索引语法,因此也可以支持F#切片语法,例如xs[3..5]。非常奇怪的是,必须切换到数组类型才能使用切片,但不必为索引进行切换

尽管如此,朱丽叶回答说,大多数情况下,切割列表是错误的方法,仍然是正确的。因此,使用此功能时要明智