Я пытаюсь использовать Junction
для воспроизведения поведения, которое я привык в Perl от List::Util::all
.
Я использую соединение all
в следующем утверждении:
# does not work
return not know(@possible-dates) and not know tell day all(@possible-dates);
не зная, что делает любая из этих функций, я предположил, что это утверждение будет эквивалентно следующему:
# works
my Bool $r = not know @possible-dates;
for @possible-dates -> $date {
$r = $r && not know tell day $date;
}
return $r;
Версия цикла for возвращает правильный результат, версия перехода - нет, и я пытаюсь понять, почему.
Полный код ниже, чтобы сообщить, что делают все функции:
my @dates = <May 15>, <May 16>, <May 19>, <June 17>, <June 18>,
<July 14>, <July 16>, <August 14>, <August 15>, <August 17>;
sub day (@date) { @date[1] }
sub month (@date) { @date[0] }
sub tell($data) {
@dates.grep({ day($_) eq $data or month($_) eq $data });
}
sub know(@possible-dates) { @possible-dates.elems == 1 }
sub statement-one(@date) {
my @possible-dates = tell month @date;
# why is this not the same as below?
return not know(@possible-dates)
and not know tell day all(@possible-dates);
# my Bool $r = not know @possible-dates;
# for @possible-dates -> $date {
# $r = $r && not know tell day $date;
# }
#
# return $r;
}
sub statement-two(@date) {
my @possible-dates = tell day @date;
not know(@possible-dates)
and know @possible-dates.grep(&statement-one);
}
sub statement-three(@date) {
my @possible-dates = tell month @date;
know @possible-dates.grep(&statement-two);
}
sub cheryls-birthday() {
@dates.grep({
statement-one($_)
and statement-two($_)
and statement-three($_)
});
}
say cheryls-birthday();