2015-10-19 3 views
2

Я пишу свою собственную повторную реализацию LINQ с помощью F # (благодаря 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>' s – Carsten

+0

также '[]:> 'seq' или' [||]:>' a 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

Это красиво. –

Смежные вопросы