В Perl 6, как я могу повторить поведение Perl's List :: Util :: all? - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь использовать 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();

1 Ответ

0 голосов
/ 01 мая 2018

Полагаю, самый простой ответ - сделать

zef install List::Util

, а затем положить:

use List::Util 'any';

в вашем коде. Есть некоторые тонкие различия между Perl 6 any и any с семантикой Perl 5, которая обеспечивается http://modules.perl6.org/dist/List::Util:cpan:ELIZABETH.

В Perl 6 any возвращает объект Junction. В Perl 5 any - это функция, которую вы вызываете в списке с блоком для выполнения.

...