0.1 + 0.2 != 0.3, хоча насправді ця "проблема" є не лише у JS, це наслідок того як компʼютер представляє числа із плаваючою точкою.Така ж ситуація із "дивацтвом" Пайтона коли хтось вперше бачить що
all([]) is True і, не розуміючи чому так, відносить це до категорії unexpected behaviour.Але це буквально 2500-річна філософська дискусія. Античні філософи вважали, що твердження 'всі єдинороги блакитні' має бути хибним, бо єдинорогів не існує, але сучасна логіка стверджує, що це істина, оскільки не існує єдинорогів, які не є блакитними. Python просто слідує сучасній предикатній логіці, але інша точка зору (у нашому випадку що
all([]) має бути False як і порожній список) також досить поширена і була загальноприйнятою позицією до останніх кількох сотень років.Але ми не філософи, ми програмісти, тому краще подивитись на більш практичні приклади:
all([]) # True
any([]) # False
math.prod([]) # 1
sum([]) # 0
max([]) # ValueError!
Справа у тому що ці функції реалізують концепцію з теорії категорій - моноїд.
Коли ми працюємо зі списками, нам важливо щоб операції над ними працювали передбачувано. Наприклад, якщо у нас є два списки xs та ys, то:
>>> from math import prod
>>> prod(xs + ys) == prod(xs) * prod(ys)
True
>>> sum(xs + ys) == sum(xs) + sum(ys)
True
А тепер цікавий момент - що буде якщо ys буде порожнім списком? Тоді:
prod(xs) == prod(xs + []) == prod(xs) * prod([])
Це рівняння може бути правдивим тільки якщо
math.prod([]) == 1! Тобто одиниця тут виступає як нейтральний елемент для множення. У цього навіть є своє імʼя - порожній добуток (empty product).Те саме і з іншими функціями:
-
sum([]) == 0, бо 0 - нейтральний елемент для додавання-
all([]) == True, бо True - нейтральний елемент для and-
any([]) == False, бо False - нейтральний елемент для orА от
max() такого елемента не має! Не існує такого числа n, для якого max(x, n) == x для будь-якого x. Саме тому max([]) викидає помилку.Доречі у цього явища є своє імʼя - вакуумна істина (vacuous truth). Це коли вираз вважається істинним, оскільки його умова не має сенсу.
Лінки:
- https://uk.wikipedia.org/wiki/%D0%9C%D0%BE%D0%BD%D0%BE%D1%97%D0%B4
- https://en.wikipedia.org/wiki/Empty_product
- https://en.wikipedia.org/wiki/Vacuous_truth
- https://news.ycombinator.com/item?id=37264149
- https://buttondown.com/hillelwayne/archive/why-any-is-true-prod-is-1-etc