在Perl 6中,我如何复制Perl的List :: Util :: all的行为?

时间:2018-05-01 12:59:53

标签: perl6 perl6-junction

我正在尝试使用JunctionList::Util::all复制我在Perl中习惯的行为。

我在以下语句中使用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 :(得分:7)

我想最简单的答案是做一个

zef install List::Util

然后输入:

use List::Util 'any';
你的代码中的

。 Perl 6 anyany之间存在一些细微差别,其中http://modules.perl6.org/dist/List::Util:cpan:ELIZABETH提供了Perl 5语义。

在Perl 6中,any返回Junction个对象。在Perl 5中any是一个函数,您可以在列表上调用一个块来执行。