varias superponer studio modificar lineas graficos graficas ejes list f#

superponer - ¿Cuándo usar una secuencia en F#en lugar de una lista?



superponer graficas en r (5)

Entiendo que una list realidad contiene valores, y una sequence es un alias para IEnumerable<T> . En el desarrollo práctico de F #, ¿cuándo debería usar una secuencia en lugar de una lista?

Aquí hay algunas razones que puedo ver cuando una secuencia sería mejor:

  • Al interactuar con otros lenguajes .NET o bibliotecas que requieren IEnumerable<T> .
  • Necesidad de representar una secuencia infinita (probablemente no sea realmente útil en la práctica).
  • Necesita una evaluación perezosa.

¿Hay otros?


Creo que su resumen sobre cuándo elegir Seq es bastante bueno. Aquí hay algunos puntos adicionales:

  • Use Seq de forma predeterminada al escribir funciones, porque luego funcionan con cualquier colección .NET
  • Use Seq si necesita funciones avanzadas como Seq.windowed o Seq.pairwise

Creo que elegir Seq por defecto es la mejor opción, entonces, ¿cuándo elegiría un tipo diferente?

  • Use List cuando necesite un procesamiento recursivo usando los patrones head::tail
    (para implementar alguna funcionalidad que no está disponible en la biblioteca estándar)

  • Use List cuando necesite una estructura de datos inmutables simple que pueda compilar paso a paso
    (por ejemplo, si necesita procesar la lista en un hilo - para mostrar algunas estadísticas - y al mismo tiempo continuar construyendo la lista en otro hilo a medida que recibe más valores, es decir, desde un servicio de red)

  • Use List cuando trabaje con listas cortas: list es la mejor estructura de datos para usar si el valor a menudo representa una lista vacía , porque es muy eficiente en ese escenario

  • Use Array cuando necesite grandes colecciones de tipos de valor
    (las matrices almacenan datos en un bloque de memoria plano, por lo que son más eficientes en cuanto a la memoria en este caso)

  • Use Array cuando necesite acceso aleatorio o más rendimiento (y localidad de caché)


Siempre debe exponer Seq en sus API públicas. Use List and Array en sus implementaciones internas.


Solo un pequeño punto: Seq y Array son mejores que List para el paralelismo.

Tiene varias opciones: PSeq de F # PowerPack, Array.Parallel module y Async.Parallel (cálculo asincrónico). La lista es horrible para la ejecución paralela debido a su naturaleza secuencial (composición head::tail ).


También prefiere seq cuando:

  • No desea mantener todos los elementos en la memoria al mismo tiempo.

  • El rendimiento no es importante.

  • Debe hacer algo antes y después de la enumeración, por ejemplo, conectarse a una base de datos y cerrar la conexión.

  • No está concatenándose (el Seq.append repetido Seq.append desbordamiento).

Prefiere la list cuando:

  • Hay pocos elementos

  • Estarás antepuesto y decapitando mucho.

Ni la seq ni la list son buenas para el paralelismo, pero eso no necesariamente significa que sean malas tampoco. Por ejemplo, podría usar cualquiera de los dos para representar un grupo pequeño de elementos de trabajo separados para hacer en paralelo.


la lista es más funcional, amigable con las matemáticas. cuando cada elemento es igual, 2 listas son iguales.

la secuencia no es

let list1 = [1..3] let list2 = [1..3] printfn "equal lists? %b" (list1=list2) let seq1 = seq {1..3} let seq2 = seq {1..3} printfn "equal seqs? %b" (seq1=seq2)