raku - Perl6中的多种可能的输出类型

标签 raku

我想制作一个返回Range或由多个any Junction组成的Ranges的函数。

例如:

sub foo (Range $a, Range $b) {
  if $a.min <= $b.max && $b.min <= $a.max {
    ($a.min < $b.min ?? $a.min !! $b.min)..($a.max < $b.max ?? $a.max !! $b.max) 
  } else {
    ($a|$b)  
  }
}

是否有一种简单的方法可以向子项添加Type约束,使其可以返回RangeJunction

我的想法包括
  • 在where子句中进行检查的Multi子项。
  • 子集Any
  • 总是返回一个结点并只使用one()(但我想保留范围)

    但是,如果有人可以想到一种更简单的方法。

  • 最佳答案

    只需创建一个容纳两个结果的subset,然后将其当作类型使用即可。

    请注意,由于Junction不是Any的子类型,因此必须将其标记为Mu
    (Junction特别不能是Any并按其方式工作)

    my subset Range-or-Junction of Mu where Range|Junction;
    

    proto sub foo ( Range, Range --> Range-or-Junction ) {*}
    
    multi sub foo (Range $a,Range $b where $a.min ~~ $b || $a.max ~~ $b --> Range){
      # note that this is wrong as it doesn't takes into consideration
      # :excludes-min or :excludes-max
      min($a.min,$b.min) .. max($a.max,$b.max)
    }
    multi sub foo (Range $a,Range $b --> Junction){
      $a | $b
    }
    

    关于raku - Perl6中的多种可能的输出类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51285659/

    相关文章:

    raku - Perl6使用代理触发属性访问

    raku - 使用 Panda 安装 Perl6 模块的路径

    regex - 在 Perl 6 中匹配非空白字符

    http - Perl 6 错误 : Malformed UTF-8

    printing - Perl6 Terminal::Print 如何提示用户输入文本?

    raku - 日期对象 "forgets"格式化程序?

    regex - 无法在 perl6 中编写语法来解析带有特殊字符的行

    raku - 处理 Perl6 库的工作流程

    raku - 如何在 Perl 6 中对列表的所有元素进行功能性操作?

    read-eval-print-loop - Perl6 REPL 用法