Linq F#:不使用Seq.empty编写空序列
我用F#编写了我自己的LINQ重新实现(感谢Jon Skeet的灵感) 我使用一个技巧生成空序列:Linq F#:不使用Seq.empty编写空序列,linq,f#,sequence,seq,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 [] 让它为空 } printfn“%A”为空/->
let empty<'b> =
seq {
for n = 0 to -1 do
yield Unchecked.defaultof<'b>
}
printfn "%A" empty<int> // -> seq []
让它为空
}
printfn“%A”为空/->seq[]
有什么惯用的方法可以做到这一点吗
(
Seq.empty
没有用,我只是重新实现它)我能想到的使用序列表达式的最简单实现是:
let empty() = seq { do () }
或者,如果您想要通用值而不是函数:
let empty<'T> : seq<'T> = seq { do () }
let empty=seq{do()}
我们只需要为一个序列表达式编写
seq{}
,它不产生任何值,但在语法上是无效的,因此我们需要在序列表达式中做一些事情。使用do()
只是告诉编译器这是一个语法有效的序列表达式,在求值时不做任何事情(也不产生任何值) 为什么Seq.empty
不可用,而Seq
生成器是空的?无论如何,您始终可以使用一个对象表达式,该表达式返回一个IEnumerable
salso[]:>'一个seq
或[|]一个seq:>'一个seq
或任何类似的内容;)可以看出佳能的做法