我使用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
没用,我只是重新实现它)
答案 0 :(得分:7)
使用序列表达式的最简单的实现我可以想到:
let empty() = seq { do () }
或者如果你想要一个通用值而不是一个函数:
let empty<'T> : seq<'T> = seq { do () }
人们只想为不产生任何值的序列表达式编写seq { }
,但这在语法上没有效果,所以我们需要在内部序列表达。使用do ()
只是告诉编译器这是一个语法上有效的序列表达式,它在评估时不做任何事情(并且不产生任何值)。