F#:在不使用Seq.empty的情况下编写空序列

Rom*_*hin 2 linq f# sequence seq

我使用F#编写了自己的LINQ重新实现(感谢Jon Skeet的灵感).

我用一个技巧来生成空序列:

let empty<'b> =
        seq {
            for n = 0 to -1 do
                yield Unchecked.defaultof<'b>
        }

printfn "%A" empty<int> // -> seq []
Run Code Online (Sandbox Code Playgroud)

有没有惯用的方法来做到这一点?

(Seq.empty没用,我只是重新实现它)

Tom*_*cek 8

使用我能想到的序列表达式的最简单的实现是:

let empty() = seq { do () }
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要一个通用值而不是一个函数:

let empty<'T> : seq<'T> = seq { do () }
Run Code Online (Sandbox Code Playgroud)

人们可能只想编写seq { }一个不产生任何值的序列表达式,但这在语法上并不合适,所以我们需要在序列表达式中做一些事情.使用do ()只是一种告诉编译器这是一个语法上有效的序列表达式的方法,它在评估时不会做任何事情(并且不会产生任何值).