Действительно ли возможно соответствовать анализируемым последовательностям в F#?

Не имеет смысла для 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 вместо этого?

16
задан Robert Harvey 17 November 2009 в 15:46
поделиться

3 ответа

Если вы используете тип 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
23
ответ дан 30 November 2019 в 17:27
поделиться

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 #, я думаю, что это '

9
ответ дан 30 November 2019 в 17:27
поделиться

Помните, что seq также имеет функции сокращения карты, так что вам часто удастся обойтись только ими. В этом примере ваша функция эквивалентна «Seq.isEmpty». Вы можете попробовать запустить fsi и просто пройти через опции завершения табуляции (введите «Seq.» И часто нажимайте табуляцию); у него может быть то, что вы хотите.

0
ответ дан 30 November 2019 в 17:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: