如何在抓取多行时优雅地关闭FSharp中的File / Stream / Seq?

时间:2014-05-17 23:32:12

标签: f#

我试图在FSharp中编写一个类来懒惰地读取文本文件中的行并将它们转换为适当的Record类型。我的记录是多行,所以我使用Seq.take函数来一次拉出尽可能多的行 - 在这种情况下是4。

let readLines = seq {
    while not inputStream.EndOfStream do
        yield inputStream.ReadLine()
    inputStream.Close()
}

let lineQuartet readLines = Seq.take 4 readLines

我遇到的问题是,当我用完线条而不是在那里结束时,我会得到空的seq,导致读者崩溃。

处理此问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:4)

有点不清楚你在问什么,但如果你想要一个比Seq.take更“强大”的替代品,你可以使用Seq.truncate

let lineQuartet readLines = Seq.truncate 4 readLines

最多返回4个元素。

答案 1 :(得分:0)

这个问题也可以通过更容忍缺失元素的考虑来解决。

let tryTake n (sq : _ seq) =
        let e = sq.GetEnumerator()
        let i = ref 0
        seq {
            while e.MoveNext() && !i < n do
                i := !i + 1
                yield e.Current
        }

(改编自this link