Pour répondre à la question de savoir s'il existe une fonction de bibliothèque pour encapsuler ce modèle - il n'y a pas de fonction exactement pour cela, mais il existe une fonction qui vous permet de générer une séquence à partir d'un état appelé Seq.unfold
. Vous pouvez l'utiliser pour mettre en œuvre la fonctionnalité ci-dessus comme ceci :
new StreamReader(filePath) |> Seq.unfold (fun sr ->
match sr.ReadLine() with
| null -> sr.Dispose(); None
| str -> Some(str, sr))
El sr
représente le lecteur de flux et est passée comme état. Tant qu'il vous donne des valeurs non nulles, vous pouvez retourner Some
contenant un élément à générer et l'état (qui peut changer si vous le souhaitez). Lorsqu'il lit null
nous le jetons et le rendons None
pour terminer la séquence. Ce n'est pas un équivalent direct, parce qu'il ne dispose pas correctement de StreamReader
lorsqu'une exception est levée.
Dans ce cas, j'utiliserais sans aucun doute l'expression de séquence (qui est plus élégante et plus lisible dans la plupart des cas), mais il est utile de savoir qu'elle peut également être écrite à l'aide d'une fonction d'ordre supérieur.