【问题标题】:Multiple Possible Output Types in Perl6Perl6 中多种可能的输出类型
【发布时间】:2018-07-11 12:37:06
【问题描述】:

我想创建一个函数,它返回一个Range 或一个由多个Ranges 组成的any Junction。

例如:

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)  
  }
}

是否有一种简单的方法可以向 sub 中添加类型约束以表示它可以返回 Range 或 Junction?

我的想法包括

  • 在 where 子句中进行检查的多子。
  • 子集Any。
  • 总是返回一个联结并只使用 one() (但我想保留可能的范围)

但如果有人能想到更简单的方法。

【问题讨论】:

  • 签名中返回值不同的multi sub,对我来说感觉最自然,最高效。
  • 您是否考虑过 always 返回一个 Junction,但可能包含 1 个元素?
  • 我正在考虑这个问题。我目前正在努力弄清楚我想要实现的目标。 :)

标签: raku


【解决方案1】:

只需创建一个可容纳这两种结果的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
}

【讨论】:

  • @sɐunıɔןɐqɐp 实际上,根据 Scimon 写的评论,我猜我可以只说“Junction 属于 Mu 类型”,而他本来可以填写其余部分。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多