TGViewer
Блог* Блог* @dereference_pointer_there · 1.99K subscribers
Post #10724 1.19K
#prog #моё

У метода Iterator::all — который возвращает, удовлетворяют ли все элементы в итераторе переданному предикату — есть вот такая строчка в документации:

An empty iterator returns true.


Более того, аналогичное утверждение есть и в документации метода allMatch на Java Stream API, и в документации встроенной функции all в Python, и в документации IEnumerable.All в C#. Некоторые странные люди утверждают, что all на пустой последовательности должен возвращать false — дескать, нет значений — не возможности определить значения.

Я здесь для того, чтобы сказать, что эти люди неправы.

Условный all(seq, pred), где seq — это последовательность a1, a2, ..., an, вычисляет значение pred(a1)∧ pred(a2) ∧ ... ∧ pred(an) (∧ — символ коньюкции, который в ЯП часто называют &&). Коньюкция — операция коммутативная и ассоциативная, поэтому если последовательность s является конкатенацией последовательностей a = a1, a2, ..., an и b = b1, b2, ..., bn, то мы можем переставить скобки и посчитать

all(s, pred) = pred(a1) ∧ ... pred(an) ∧ pred(b1) ∧ ... ∧ pred(bn)

как

(pred(a1) ∧ ... pred(an)) ∧ (pred(b1) ∧ ... ∧ pred(bn)) = all(a, pred) ∧ all(b, pred)

Или, иными словами и в синтаксисе Rust, если x и y — итераторы, то логично ожидать, что x.chain(y).all(p) вернёт тот же результат, что и x.all(p) && y.all(p).

Это свойство должно работать для любых последовательностей, включая пустые. С другой стороны, любую последовательность можно представить, как конкатенацию этой же последовательности с пустой. Или, в синтаксисе Rust, с поправкой на типы x и x.chain(iter::empty()) ведут себя одинаково. Подставив это в свойство выше, мы получаем, что x.all(p) && iter::empty().all(p), x.chain(iter::empty()).all(p) и x.all(p) должны возвращать один и тот же результат. Для произвольного итератора x это возможно только в том случае, если iter::empty().all(p) возвращает значений, нейтральное для коньюкции, то есть true. Иными словами, Iterator::all должен возвращать true на пустом итераторе, ч. и т. д.

Аналогичные соображения показывают, почему Iterator::any должен возвращать false.
  • 💯 29
  • 🤝 11
  • ❤‍🔥 3
  • 🤡 2
More from @dereference_pointer_there
  1. Oct 9, 2026#prog #rust #meme Было в r/rustjerk, но сначала выложили в r/ClaudeCode
  2. Oct 9, 2026Welp
  3. Oct 9, 2026#prog #article Оттуда: The case against JPEG XL
  4. Oct 9, 2026#prog #article Shipping JPEG XL in Chrome Но в треде на r/rust пишут, что есть сомнения в…
  5. Oct 9, 2026#prog #rust #rustlib hashify v0.3: compile-time perfect hashing, now 4 to 12 times faster…
  6. Oct 9, 2026#prog #meme про... Slop
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →