Perl 6 Reduction Function und Reduction Metaoperator liefern unterschiedliche Ergebnisse


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

Meine Frage ist zweifach: Erstens, warum verarbeitet der Reduktions-Metaoperator den <Operator anders? Es sieht so aus, als würde das Reduktions-Metaop schätzungsweise eine Variable verwenden, die bei der ersten Änderung von wahr zu falsch diese Änderung beibehält, weil:

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

Zweitens möchte ich dies auch in der Reduktionsfunktion verwenden, dh Code in die geschweiften Klammern der Reduktionsfunktion einfügen, damit das gleiche Ergebnis wie beim Reduktions-Metaoperator erzielt wird. Wie kann ich es tun? Vielen Dank.

Antworten:


17

Sowohl der Meta-Operator als reduceauch die Assoziativität des an sie übergebenen Operators berücksichtigen; im Fall von <verkettet der Bediener.

Wenn Sie einen benutzerdefinierten Block übergeben, reducekönnen Sie ihn nicht sehen. Daher wird auf die Standardeinstellung für Linksassoziative zurückgegriffen. Anschließend werden die späteren Werte mit dem vom Reduzierer zurückgegebenen Booleschen Wert verglichen, der mit 0oder nummeriert 1wird, weshalb das Ergebnis wie Trueam Ende endet .

Sie können die gewünschte Semantik erhalten, indem Sie Ihre Reduktionsfunktion als verkettende Assoziativität deklarieren:

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.