Baggy add (+) 是否适用于 MixHash 权重?

Does Baggy add (+) work on MixHash weights?

我正在使用 MixHash 将两个哈希与 Bag add (+) 运算符结合起来。这似乎可行 - 但是......我有点惊讶联合的结果需要重新强制返回到 MixHash。

我的猜测是 Bag 添加 (+) 中缀运算符首先将所有内容强制转换为 Bag,然后 returns 结果作为 Bag。这对我来说可能有风险,因为我的一些权重是负数(因此首先是 Mix)。这会正确地添加负权重吗?

或者,是否有混合加 (+) 运算符?

my MixHash $dim-mix;
for ... {
    my $add-mix = $!dims.MixHash;
    $dim-mix = $dim-mix ?? ( $dim-mix (+) $add-mix ).MixHash !! $add-mix;
}
dd $dim-mix;

现在我看这段改写的代码,也许有一些三元的表述?? !!那可以避免在测试中拼出 $dim-mix 因为已经在左边了?

非常感谢任何建议!

my $add-mix = (foo => 0.22, bar => -0.1).Mix;

my $dim-mix;
for ^5 {
  $dim-mix (+)= $add-mix;
}
dd $dim-mix; # Mix $dim-mix = ("foo"=>1.1,"bar"=>-0.5).Mix

显然我没有使用 MixHash,但如果需要,您可以在循环后解决这个问题。

(当然你可能会想 "but isn't a Mix immutable?" 是——但是你必须区分变量和值。$dim-mix 是一个变量,一个 Scalar 变量。即使你输入它——my Mix $dim-mix;它仍然是一个Scalar变量持有一个Mix。你可以总是分配给 Scalar.)

我开始习惯于回答这样的问题,我不知道发生了什么,但我想我应该能够弄清楚。这是我的过程:

  • 我得到了你的代码 运行 看看它做了什么。我试图简化三元组。嗯。

  • 我求助于医生。有 the doc page for (+)。那叫它"Baggy addition"。考虑到 Bag 仅包含(正)整数,这令人担忧。

  • 我翻到了源码。我开火了 a search of the rakudo sources for "Baggy addition". One result. I focused on the multi with (Mixy:D $a, QuantHash:D $b) signature。这告诉我结果应该保持 Mixy,即文档的暗示它会或可能会 Baggy 是一个红色鲱鱼。

  • 我回到代码并开始思考我能做什么。当我最初尝试使用 (+)= 来简化主赋值时,编译器抱怨 expected MixHash but got Mix。我尝试了六种无效的方法,然后将 $dim-mix 上的 MixHash 约束更改为 Mixy 并且它起作用了。

  • 然后我仔细想想发生了什么,意识到几乎所有的类型都在阻碍 P6 做正确的事情。

如果您确实需要某些类型,您可以重新添加它们。

(但是你真的需要它们吗?当类型是绝对必要的时候,它们是很棒的。否则,imo,在引入它们之前三思而后行。他们很容易使代码更难阅读、推理、编写和变慢。)

(当然,在某些情况下,它们并不是绝对必要的,但确实对整体有帮助。我和所有事情一样,一开始就保持简单,只有当您看到特定系列的明显好处时才会复杂化代码。)