Perl 6 azaltma işlevi ve azaltma metaoperatörü farklı sonuçlar verir


12
my @s=<1 2 3 2 3 4>;
say reduce {$^a < $^b}, @s;
say [<] @s;
# --------
# True
# False

Benim sorum iki kat: Birincisi, azaltma metaoperator neden <operatörü farklı işler ? İndirgeme metaopu, doğrudan yanlış'a ilk değişiklikte bu değişikliği koruyan bir değişken kullanıyor.

say [\<] @s;
# ----------
# (True True True False False False)

İkincisi, bunu azaltma işlevinin içinde de kullanmak istiyorum, yani azaltma işlevinin kıvırcık parantezleri içinde bazı kodlar sunarak azaltma meta operatörü ile aynı sonucu verir. Nasıl yapabilirim? Teşekkür ederim.

Yanıtlar:


17

Hem meta-operatör hem de operatörün reducekendisinin ilişkisini dikkate alarak; durumunda <, zincirleme operatörü.

Özel bir bloğu geçerken reduce, onun içinde göremezsiniz ve böylece sol çağrışımın varsayılan değerine geri döner; daha sonra, değerleri redüktörden döndürülen boole ile karşılaştırır, bu sayı 0veya 1bu şekilde sonuçlanır, bu nedenle sonuç Truesonda olduğu gibi sonuçlanır .

Azaltma fonksiyonunuzu zincirleme bir ilişkiye sahip olarak beyan ederek istediğiniz anlambilim elde edebilirsiniz:

my @s1 =<1 2 3 2 3 4>;
my @s2 =<1 2 3 4>;
sub my-reducer($a, $b) is assoc('chain') {
    $a < $b
}
say reduce &my-reducer, @s1;    # False
say reduce &my-reducer, @s2;    # True
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.