2015-10-19 37 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

很漂亮。 –