Один из способов сделать это - использовать базовый IEnumerator<String>
.Это не совсем одна строка, но кажется, что она немного чище, чем ваша реализация.(Не зависит от mutable, правильно использует идиомы .NET.)
По сути, вы получаете интерфейс IEnumerator <'a> из последовательности, а затем просто зацикливаетесь на вызове MoveNext.Это будет нормально работать с бесконечной последовательностью.
> let getNextFunc (seqOfLines : seq<'a>) =
- let linesIE : IEnumerator<'a> = seqOfLines.GetEnumerator()
- (fun () -> ignore (linesIE.MoveNext()); linesIE.Current);;
val getNextFunc : seq<'a> -> (unit -> 'a)
Чтобы использовать, просто передайте getNextFunc
последовательность, и она вернет вашу функцию nextLine.
> let sequenceOfStrings = seq { for i = 0 to 10000 do yield i.ToString() };;
val sequenceOfStrings : seq<string>
> let nextLine = getNextFunc sequenceOfStrings;;
val nextLine : (unit -> string)
> nextLine();;
val it : string = "0"
> nextLine();;
val it : string = "1"
> nextLine();;
val it : string = "2"
> nextLine();;
val it : string = "3"