我有一个使用perl6的subset命令构造的类型层次结构,以及一些专门针对这些类型的多重子。当发生多调度时,如何赋予最窄子类型所专用的子最高的优先级?

这是简化的代码:

#! /usr/bin/env perl6

use v6.c;

proto check($value) { * }

subset Positive of Int where * > 0;

subset PositiveEven of Positive where * %% 2;

multi check(Int $value) {
    say "integer"
}

multi check(Positive $value) {
    say "positive"
}

multi check(PositiveEven $value) {
    say "positive & even"
}

# example:
check(32);

# expected output:
#   positive & even

# actual output:
#   positive

最佳答案

由于所有候选者都同样严格,因此将采用与其余约束(或缺少约束)匹配的第一个约束。这是在其中指定了多个候选的顺序变得重要的时候。如果您将按以下顺序指定它们:

multi check(PositiveEven $value) { say "positive & even" }
multi check(Positive $value) { say "positive" }
multi check(Int $value) { say "integer" }

以下将满足您的期望:
check(32);   # positive & even

10-07 14:58