Creo que su enfoque es bueno en este escenario. No existe una función incorporada para poner en práctica la repetición, pero si es necesario repetir secuencias menudo, se pueden seleccionar uno mismo y hacer que esté disponible en el módulo Seq
:
module Seq =
let repeat items =
seq { while true do yield! items }
A continuación, puede muy bien escribir Seq.repeat [ 1 .. 4 ]
, como si repeat
era una función de biblioteca F # estándar, porque F # IntelliSense muestra las dos funciones de su módulo Seq
y del módulo Seq
como si estuvieran definidas en un único módulo.
Además de su implementación, también puede usar la expresión de secuencia recursiva, que es otro patrón bastante común al generar secuencias. Usando while
es en cierto modo imperativo (aunque no es necesario ningún estado de repeticiones simples) en comparación con la recursividad funcional:
let rec repeat items =
seq { yield! items
yield! repeat items }
Este enfoque es mejor cuando se quiere mantener un cierto estado generando al mismo tiempo. Por ejemplo, generar todos los números 1 ..
usando while
no sería tan agradable, porque necesitaría un estado mutable. El uso de la recursividad, se puede escribir lo mismo que:
let rec numbersFrom n =
seq { yield n
yield! numbersFrom (n + 1) }
Una Gotcha aquí: 'Seq.initInfinite' solo genera secuencias infinitas para ciertos valores de infinito. De [documentación] (http://msdn.microsoft.com/en-us/library/ee370429.aspx): "La iteración puede continuar hasta Int32.MaxValue". –
Se ajusta a la definición de infinito del Core lib, que es una definición de trabajo utilizable. – Daniel