Perl 6 также занимает позицию, что all()
и any()
в пустых списках должны служить в качестве нормальных базовых вариантов для их соответствующих операторов сокращения, и поэтому all()
- это истина, а any()
- это ложь.
То есть, all(a, b, c)
эквивалентно [&] a, b, c
, что эквивалентно a & b & c
(сокращение на оператор "junctive and", но вы можете игнорировать переходы и считать это логичным и для этого поста) и any(a, b, c)
эквивалентно [|] a, b, c
, что эквивалентно a | b | c
(сокращение на оператор "junctive или" - опять же, вы можете притвориться, что оно такое же, как логическое или ничего не пропустить).
Любой оператор, к которому может быть применено сокращение, должен иметь определенное поведение при сокращении 0 терминов, и обычно это делается с помощью элемента естественной идентичности - например, [+]()
(сокращение сложения через нулевые термины) 0, потому что 0 аддитивная идентичность; добавление нуля к любому выражению оставляет его неизменным. [*]()
аналогично 1, потому что 1 - мультипликативная идентичность. Мы уже говорили, что all
эквивалентно [&]
, а any
эквивалентно [|]
- хорошо, правда - это и -идентичность, а ложь - или -dentity - x и True - это x, а x или False - это x. Это делает неизбежным, что all()
должно быть истинным, а any()
должно быть ложным.
Чтобы поместить это в совершенно иную (но практическую) перспективу, any
- это защелка, которая начинается с ложного и становится истинной всякий раз, когда она видит что-то истинное; all
- это защелка, которая начинается с истины и становится ложной всякий раз, когда она видит что-то ложное. Если у них нет аргументов, это значит, что у них нет шансов изменить состояние, поэтому вы просто спрашиваете их, какое у них состояние «по умолчанию». :)