跨功能共享签名约束

Hun*_*len 5 signature perl6

给定一个简单的程序来转换为基数:

#!perl6

my @alphabet = ('0' .. '9', 'A' .. 'Z', 'a' .. 'z').flat;
sub to-digits(Int $n is copy, Int $b where 2 <= * <= 62 --> Str) {
  my @digits; 
  while $n > 0 {
    @digits.push(@alphabet[$n % $b]);
    $n = $n div $b;
  }

  @digits.reverse.join;
}

sub from-digits(Str $digits, Int $b where 2 <= * <= 62 --> Int) {
  my $n = 0;
  for $digits.comb -> $d {
    $n = $b * $n + @alphabet.first({ $_ eq $d }, :k);
  }

  $n;
}

sub to-base(
  Str $n, 
  Int $b where 2 <= * <= 62, 
  Int $c where 2 <= * <= 62 --> Str) {
  to-digits(from-digits($n, $b), $c);
}
Run Code Online (Sandbox Code Playgroud)

我发现where * >= 2 && * <= 62在我的程序中,我在所提供的基础上重复了四次约束.查看文档,Signatures我看到你可以保存这样的签名:

my $sig = :(Int $a where $a >= 2 && $a <= 62);
Run Code Online (Sandbox Code Playgroud)

是否有一种方法可以将此签名应用于多个功能和/或如何跨功能共享此约束?

Hun*_*len 6

事实证明,你不能在@moritz中概述的多个功能中共享签名:在Perl 6中我可以使用独立的签名作为签名吗?

但是,您可以使用Subset#perl6 Freenode irc中概述的@zoffix 共享约束:

subset Base of Int where 2 <= * <= 62;
sub to-digits(Int $n is copy, Base $b) {
  ...
}
...
Run Code Online (Sandbox Code Playgroud)