参数化子集

jjm*_*elo 6 types perl6

据我了解,您只能通过值本身对子集进行参数化

subset MoreThanZero where * > 0
Run Code Online (Sandbox Code Playgroud)

但是,有没有直接的方法可以实现这样的东西?

subset MoreThan[\x] where * > x
Run Code Online (Sandbox Code Playgroud)

然后声明

my MoreThan[1000] $thousand-plus
Run Code Online (Sandbox Code Playgroud)

也许一种回旋方式是使用参数化角色,但是我在考虑一种更直接的方法。有一个吗?

Jon*_*ton 9

可能最简单的选择是创建提供自定义parameterize方法的类型,然后使用MOP基于该类型构造子集类型:

class MoreThan {
    method ^parameterize(Mu, $limit) {
        Metamodel::SubsetHOW.new_type:
            name => "more than $limit",
            refinee => Numeric,
            refinement => * > $limit
    }
}
Run Code Online (Sandbox Code Playgroud)

然后这样:

my MoreThan[0] $x = 1;
say $x;
my MoreThan[2] $y = 3;
say $y;
$y = 1;
Run Code Online (Sandbox Code Playgroud)

产生:

1
3
Type check failed in assignment to $y; expected more than 2 but got Int (1)
  in block <unit> at ss.p6 line 14
Run Code Online (Sandbox Code Playgroud)