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.

Romario
quelle

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
Jonathan Worthington
quelle