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

F#: Compose empty sequence without using Seq.empty

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

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

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

printfn "%A" empty<int> // -> seq []

有什么惯用的方法可以做到这一点吗?

(Seq.empty没有用,我只是重新实现一下)

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

let empty() = seq { do () }

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

let empty<'T> : seq<'T> = seq { do () }

人们只想为不产生任何值的序列表达式编写 seq { },但这在语法上是无效的,因此我们需要在其中做 something序列表达式。使用 do () 只是告诉编译器这是一个语法上有效的序列表达式,在求值时它不执行任何操作(并且不产生任何值)。