F# 使用seq表达式的递归对象警告

F# 使用seq表达式的递归对象警告,f#,F#,我有以下(简化的)代码: 开放系统 开放系统 [] 让主argv= 让rec lineseq=seq{ 将Console.ReadLine()与 |null->yield!Seq.empty |行-> 让出 } 0 Visual studio正在为第二个yield语句发出“递归对象”警告,即yield!lineseq 这是为什么?这是因为您将lineseq定义为一个值 如警告所示,只需在开头写入#nowarn“40”,或添加一个伪参数,使其成为函数: open System open Syst

我有以下(简化的)代码:

开放系统
开放系统
[]
让主argv=
让rec lineseq=seq{
将Console.ReadLine()与
|null->yield!Seq.empty
|行->
让出
}
0
Visual studio正在为第二个yield语句发出“递归对象”警告,即
yield!lineseq


这是为什么?

这是因为您将
lineseq
定义为一个值

如警告所示,只需在开头写入
#nowarn“40”
,或添加一个伪参数,使其成为函数:

open System
open System.IO

[<EntryPoint>]
let main argv =     
    let rec lineseq x = seq {
        match Console.ReadLine() with
        | null -> yield! Seq.empty
        | line ->
            yield! lineseq x
        }

    // But then you need to call the function with a dummy argument.
    lineseq () |> ignore

    0

它对这个问题有一个解释:

啊,哎呀。我猜可能是因为它被急切地评估了?是的,值可能被急切地评估了,但事实并非如此,因为它是一个懒惰的seq。
open System
open System.IO

[<EntryPoint>]
let main argv =     
    let rec lineseq x = seq {
        match Console.ReadLine() with
        | null -> yield! Seq.empty
        | line ->
            yield! lineseq x
        }

    // But then you need to call the function with a dummy argument.
    lineseq () |> ignore

    0
let main argv =     
    let rec lineseq x = seq {
        match Console.ReadLine() with
        | ""   -> yield! Seq.empty
        | line -> yield! lineseq x}

    lineseq () |> Seq.toList |> ignore
    0