Pregunta

Con una let foo = [|1;2;3;4|] matriz I se puede utilizar cualquiera de los siguientes para devolver una rebanada de una matriz.

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

¿Cómo puedo hacer lo mismo para la Lista let foo2 = [1;2;3;4]? Cuando trato de la misma sintaxis que la matriz consigo error FS00039: The field, constructor or member 'GetSlice' is not defined.

¿Cuál es el método preferido para conseguir una subsección de una lista y por qué no se construyeron para apoyar GetSlice?

¿Fue útil?

Solución

  

¿Cuál es el método preferido para conseguir   una subsección de una lista y por qué no están   construida para soportar GetSlice?

Vamos a hacer la última pregunta y la primera pregunta última:

¿Por qué las listas no son compatibles con GetSlice

Las listas se implementan como listas enlazadas, por lo que no tenemos acceso indexado eficiente para ellos. En términos comparativos, foo.[|m..n|] lleva tiempo O(n-m) para las matrices, una sintaxis equivalente lleva tiempo O(n) en las listas. Esta es una gran cosa, porque nos impide utilizar la sintaxis de rebanado de manera eficiente en la gran mayoría de los casos en los que sería útil.

Por ejemplo, puede cortar hasta una matriz en trozos de igual tamaño en tiempo lineal:

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

Pero lo que si estábamos usando una lista en su lugar? Cada llamada a foo.[a..a+size] tomaría más tiempo y más y más, toda la operación es O(n^2), por lo que es bastante inadecuado para el trabajo.

La mayoría de las veces, cortando una lista es un enfoque equivocado. Normalmente utilizamos la coincidencia de patrones para recorrer y manipular listas.

método preferido para cortar una lista?

Siempre que sea posible, el uso de la coincidencia de patrones si es posible. De lo contrario, se puede recurrir a Seq.skip y Seq.take para cortar correctamente las listas y secuencias para usted:

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

Otros consejos

F # 4.0 permitirá sintaxis de corte para las listas ( enlace).

Justificación es aquí :

  

El tipo F # lista ya soporta un operador de índice, xs. [3]. Esto se hace a pesar del hecho de que las listas están listas enlazadas en Fa # -. Listas se utilizan tan comúnmente en F # F # que en 2.0 se decidió apoyar este

     

Desde se admite una sintaxis de índice, que tiene sentido para apoyar también la sintaxis de rebanado # F, por ejemplo xs. [3..5]. Es muy extraño tener que cambiar a un tipo de matriz de uso de rebanado, pero que no tiene que hacer que el interruptor para la indexación.

Sin embargo, Julieta respuesta, diciendo que, la mayor parte del tiempo de corte de una lista es un enfoque equivocado, sigue siendo válida. Así que ser prudente al utilizar esta función.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top