Параметризованные подмножества - PullRequest
6 голосов
/ 20 марта 2019

Насколько я понял, вы можете параметризовать подмножества только самими значениями

subset MoreThanZero where * > 0

Но есть ли прямой способ реализации чего-то подобного?

subset MoreThan[\x] where * > x

А потом объявить

my MoreThan[1000] $thousand-plus

Возможно, окольным путем было бы использовать параметризованные роли , но я думал о более прямом подходе. Есть ли один?

1 Ответ

9 голосов
/ 21 марта 2019

Вероятно, самый простой вариант - создать тип, который предоставляет пользовательский метод parameterize, а затем с помощью MOP создать тип подмножества на основе этого:

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

Тогда это:

my MoreThan[0] $x = 1;
say $x;
my MoreThan[2] $y = 3;
say $y;
$y = 1;

Производит:

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
...