Не имеет смысла для Enumeration
реализовывать Iterable
. Iterable
метод фабрики для Iterator
. Enumeration
походит Iterator
, и только поддерживает состояние для единственного перечисления.
Так, быть тщательной попыткой перенестись Enumeration
как Iterable
. Если кто-то передаст меня Iterable
, я предположу, что могу звонить iterator()
на нем неоднократно, создавая столько Iterator
экземпляры, сколько я хочу, и выполняющий итерации независимо на каждом. Обернутый Enumeration
не выполнит этот контракт; не позволяйте своему обернутому Enumeration
, сбегают из Вашего собственного кода. (Как в стороне, я заметил, что Java 7 DirectoryStream
нарушает ожидания просто этим способом и не должен быть позволен "выйти" также.)
Enumeration
похож Iterator
, не Iterable
. Collection
Iterable
. Iterator
не.
Вы не можете сделать этого:
Vector list = …
Iterator i = list.iterator();
for (X x : i) {
x.doStuff();
}
, Таким образом, не имело бы смысла делать это:
Vector list = …
Enumeration i = list.enumeration();
for (X x : i) {
x.doStuff();
}
нет никакого Enumerable
эквивалентен [1 123]. Это могло быть добавлено, не повреждая ничего для работы в на циклы, но какова будет точка? Если Вы в состоянии реализовать это новое Enumerable
интерфейс, почему не просто реализуют Iterable
вместо этого?
Если вы используете тип LazyList в PowerPack, он имеет активные шаблоны, называемые LazyList .Nil и LazyList.Cons, которые отлично подходят для этого.
Тип seq / IEnumerable не особенно подходит для сопоставления с образцом; Я очень рекомендую для этого LazyList. (См. Также Почему использование последовательности намного медленнее, чем использование списка в этом примере .)
let s = seq { 1..100 }
let ll = LazyList.ofSeq s
match ll with
| LazyList.Nil -> printfn "empty"
| LazyList.Cons(h,t) -> printfn "head: %d" h
Seq отлично работает в активных шаблонах! Если я не делаю здесь что-то ужасное ...
let (|SeqEmpty|SeqCons|) (xs: 'a seq) = //'
if Seq.isEmpty xs then SeqEmpty
else SeqCons(Seq.head xs, Seq.skip 1 xs)
// Stupid example usage
let a = [1; 2; 3]
let f = function
| SeqEmpty -> 0
| SeqCons(x, rest) -> x
let result = f a
Я не знаю, как заставить подсветку кода StackOverflow в режиме F #, я думаю, что это '
Помните, что seq также имеет функции сокращения карты, так что вам часто удастся обойтись только ими. В этом примере ваша функция эквивалентна «Seq.isEmpty». Вы можете попробовать запустить fsi и просто пройти через опции завершения табуляции (введите «Seq.» И часто нажимайте табуляцию); у него может быть то, что вы хотите.