2016-12-10 5 views
5

私はリストを取る特別な機能を持っています、リストの各メンバーは複数の要件を満たさなければなりません。これを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

答えて

7

Perl 6の型システムは、宣言的な制約を表現するのに十分な柔軟性はありませんが、カスタム式に対して、着信引数をチェックするために、あなたのパラメータにwhere句を追加することができます。あなたはさらに一歩行くことができる

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

、およびsubsetに全体where句を考慮する:

明確にするために、私はsubsetにそれぞれ番号をテストするための式を考慮したい

subset SpecialList of List where .all ~~ SpecialNumber; 

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

PS:条件(6)は奇数だけを満たしているように見えますが、あなたの要件(5)は重複している可能性があります。

+0

ありがとう、smls !!!私は同意する、(6)は冗長であることを暗示する(5)。ありがとうございました ! – lisprogtor

関連する問題