Perl 6のreduce関数とreduceメタオペレーターは異なる結果を出します


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

私の質問は2つあります。第1に、なぜ還元メタ<オペレーターがオペレーターを異なる方法で処理するのですか?削減metaopは、trueからfalseへの最初の変更時にその変更を保持する変数を使用していると推定されているようです。

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

次に、reduce関数内でもこれを使用します。つまり、reduce関数の波括弧内にコードを導入して、reductionメタ演算子と同じ結果が得られるようにします。どうすればできますか?ありがとうございました。

回答:


17

メタ演算子とreduce、それらに渡された演算子の結合性を考慮に入れます。の場合<、演算子は連鎖しています。

カスタムブロックを渡すと、reduceその内部を見ることができないため、デフォルトの左結合に戻ります。その後numifiesに減速から返されたブール値に対する後の値と比較する0、または1結果として終わる理由は、True最終的にします。

リダクション関数を連鎖連想性として宣言することで、必要なセマンティクスを取得できます。

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.