2016-12-10 22 views
5

Bir liste alan özel bir işlev var, listenin her üyesi birden çok gereksinimi karşılamalıdır. Bunu perl6 işlevinde nasıl ayarlayabilirim?perl6: Bir fonksiyonun parametresi için çoklu gereksinimleri nasıl belirleyebilirim?

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; 

Yardımlarınız için teşekkür ederiz!

lisprog

cevap

7

Perl 6 tür sistemi bildirimli tür kısıtlamaları ifade etmek kadar esnek değildir, ancak özel bir ifadesi karşı gelen argümanları kontrol etmek için parametreye bir where maddeyi ekleyebilir. Bir adım daha ileri gidebiliriz

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

ve subset içine bütün where maddesini çarpanlarına:

Anlaşılır olması için, ben bir subset içine her numarayı test etmek için ifadesini çarpanlarına ediyorum

subset SpecialList of List where .all ~~ SpecialNumber; 

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

PS: Gereksiniminizin (5) gereksiz olabileceğini düşünüyorum çünkü gereksinim (6) yalnızca tek sayıları tatmin ediyor gibi görünüyor, ancak sayı teorisinde fazla değilim, bu yüzden emin değilim.

+0

Çok teşekkür ederim, teşekkürler! Katılıyorum, (6) gereksiz olan ima (5). Tekrar teşekkürler ! – lisprogtor

İlgili konular