通过可变变量产生序列时编译错误

时间:2014-07-04 12:00:05

标签: f#

我正在编写一个函数,该函数通过StringReader获取多行字符串,并将每行返回为seq

的项目
let symbolSeq = seq {

    let mutable line = reader.ReadLine()

    while !line <> null  do
        yield line
        line <- reader.ReadLine()
}

我正在

  

此表达式应该具有类型&#39; ref,但这里有类型字符串

     

on while!---&gt; line&lt; ---&lt;&gt; null do

当我摆脱!前面的line时,我得到了一个

  

可变变量&#39; line&#39;以无效的方式使用。闭包不能捕获可变变量。考虑通过&#39; ref&#39;来消除这种突变的使用或使用堆分配的可变参考单元。和&#39;!&#39;。

为什么?

3 个答案:

答案 0 :(得分:3)

因为seq-expression隐式创建闭包,并且你不能在F#中关闭可变变量。

答案 1 :(得分:2)

您需要将行值放在ref单元格中,因为无法关闭可变值。

let symbolSeq = seq {
let line = ref (reader.ReadLine())
while !line <> null do
    yield !line
    line := reader.ReadLine()
}  

答案 2 :(得分:1)

使用ref cell的另一种方法是使用递归和yield!:

let symbolSeq =
    let rec iterate (reader : System.IO.StringReader) =
        seq
            {
                match reader.ReadLine() with
                    | null -> ()
                    | x ->
                        yield x
                        yield! iterate reader
            }

    iterate reader