首页 > 解决方案 > Perl6 中多种可能的输出类型

问题描述

我想做一个返回 aRange或a 组成的函数any Junctionmultiple 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 约束添加到 sub 以说它可以返回 aRange或 a Junction

以为我已经包括

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

标签: raku

解决方案


只需创建一个容纳这两种结果的子集,并将其用作一种类型。

请注意,由于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
}

推荐阅读