perl6: как указать несколько требований для параметра функции?

У меня есть специальная функция, которая принимает список, каждый член списка должен удовлетворять нескольким требованиям. Как мне настроить это в функции perl6?

sub specialFunc(List $x) {};

(1) $x is a list # easy, List $x, but what about the following:
(2) each member of $x is numeric
(3) each member of $x is positive
(4) each member of $x is greater than 7
(5) each member of $x is odd number
(6) each member of $x is either the square or the cube of an even number plus 1;

Спасибо за помощь !!

Lisprog


person lisprogtor    schedule 10.12.2016    source источник


Ответы (1)


Система типов Perl 6 недостаточно гибкая, чтобы декларативно выразить такие ограничения, но вы можете добавить предложение where к своему параметру, чтобы проверять входящие аргументы на соответствие настраиваемому выражению.

Для ясности я бы вынес выражение для проверки каждого числа на subset:

subset SpecialNumber of Numeric where {
       $_ > 7                        # (3), (4)
    && $_ !%% 2                      # (5), since "odd" implies "not even"
    && .narrow ~~ Int                # (5), since "odd" implies "integer"
    && ($_ - 1) ** (1/2 | 1/3) %% 2  # (6)
}

sub specialFunc(List $x where .all ~~ SpecialNumber ) {
    ...
}

Вы можете пойти еще дальше и вынести все предложение where на subset:

subset SpecialList of List where .all ~~ SpecialNumber;

sub specialFunc(SpecialList $x) {
    ...
}

PS: Я думаю, что ваше требование (5) может быть избыточным, поскольку требование (6), похоже, в любом случае удовлетворяет только нечетные числа, но я не разбираюсь в теории чисел, поэтому я не уверен.

person smls    schedule 10.12.2016
comment
Спасибо большое, smls !!! Я согласен, (6) влечет (5), что является избыточным. Еще раз спасибо! - person lisprogtor; 12.12.2016