Penso che il tuo approccio sia buono in questo scenario. Non v'è alcuna funzione incorporata per implementare la ripetizione, ma se è necessario ripetere le sequenze spesso, è possibile definire uno voi stessi e renderlo disponibile nel modulo Seq
:
module Seq =
let repeat items =
seq { while true do yield! items }
Quindi è possibile ben scrivere Seq.repeat [ 1 .. 4 ]
, come se repeat
era una funzione di libreria F # standard, perché F # IntelliSense mostra entrambe le funzioni dal modulo Seq
e dal modulo Seq
come se fossero state definite in un singolo modulo.
Oltre all'implementazione, è anche possibile utilizzare l'espressione di sequenza ricorsiva, che è un altro pattern abbastanza comune durante la generazione di sequenze. Utilizzando while
è in qualche modo imperativi (anche se non hai bisogno di qualsiasi stato per semplici ripetizioni) rispetto alla ricorsione funzionale:
let rec repeat items =
seq { yield! items
yield! repeat items }
Questo approccio è migliore quando si vuole mantenere uno stato durante la generazione. Ad esempio, la generazione di tutti i numeri 1 ..
utilizzando while
non sarebbe così piacevole, perché sarebbe necessario lo stato mutabile. Utilizzando la ricorsione, è possibile scrivere la stessa cosa:
let rec numbersFrom n =
seq { yield n
yield! numbersFrom (n + 1) }
fonte
2012-01-18 23:48:56
Uno Gotcha qui: 'Seq.initInfinite' genera solo sequenze infinite per determinati valori di infinito. Da [documentazione] (http://msdn.microsoft.com/en-us/library/ee370429.aspx): "Iteration può continuare fino a Int32.MaxValue." –
Si adatta alla definizione di infinito di Core lib, che è una definizione operativa utilizzabile. – Daniel