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,在引入它们之前三思而后行。他们很容易使代码更难阅读、推理、编写和变慢。)
(当然,在某些情况下,它们并不是绝对必要的,但确实对整体有帮助。我和所有事情一样,一开始就保持简单,只有当您看到特定系列的明显好处时才会复杂化代码。)
我正在使用 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,在引入它们之前三思而后行。他们很容易使代码更难阅读、推理、编写和变慢。)
(当然,在某些情况下,它们并不是绝对必要的,但确实对整体有帮助。我和所有事情一样,一开始就保持简单,只有当您看到特定系列的明显好处时才会复杂化代码。)