2015-10-19 39 views
2

我使用F#编写自己的LINQ重新实现(感谢Jon Skeet的灵感)。F#:编写空序列而不使用Seq.empty

我用了一招,以产生空序列:

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

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

是否有任何惯用的方法来做到这一点?

Seq.empty是没有用的,我只是重新实现它)使用序列表情我能想到的是

+0

为什么'Seq.empty'不是有用的,而'seq'构建器是?无论如何,你总是可以使用一个对象表达式来返回IEnumerable <'b>,它返回* empty *'IEnumerator <'b>' – Carsten

+0

也'']:>'seq'或'[||]:>'seq'或者任何类似的东西;) – Carsten

+0

这样做的佳能方式可以看[这里](https://github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Core/seq.fs#L20-L59) –

回答

6

最简单的实现:

let empty() = seq { do() } 

或者,如果你想有一个通用的值,而不是一个功能:

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

人会愿意只seq { }写不产生任何价值序列的表达,但塔t在语法上不是有效的,所以我们需要在序列表达式中做。使用do()只是告诉编译器这是一种语法上有效的序列表达式,它在评估时不会执行任何操作(并且不会生成任何值)。

+0

很漂亮。 –