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

时间:2015-10-19 13:25:27

标签: 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 []

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

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

1 个答案:

答案 0 :(得分:7)

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

let empty() = seq { do () }

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

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

人们只想为不产生任何值的序列表达式编写seq { },但这在语法上没有效果,所以我们需要在内部序列表达。使用do ()只是告诉编译器这是一个语法上有效的序列表达式,它在评估时不做任何事情(并且不产生任何值)。