我的猜测是Bag add()中缀操作符首先将所有内容强制转换为Bag并将结果作为Bag返回.这对我来说可能有风险,因为我的一些重量是负的(因此首先是混合).这会正确地增加负重吗?
或者,是否有Mix add()运算符?
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,但如果需要在循环之后你可以对它进行排序.
(当然你可能会想“但不是混合不可变?”它是 – 但你必须区分变量和值.$dim-mix是一个变量,一个标量变量.即使你输入它 – 我的Mix $dim-mix;它仍然是一个包含Mix值的Scalar变量.你总是可以分配一个Scalar.)
我开始习惯这样的问题,我不知道发生了什么,但我认为我应该能够弄清楚.这是我的过程:
>我让你的代码运行,看看它做了什么.我试图简化三元组.嗯.
>我转向了医生.有the doc page for (+)
.这称之为“Baggy addition”.鉴于Bag只保留(正)整数,这令人担忧.
>我转向了源头.我解雇了a search of the rakudo sources for “Baggy addition”.一个结果.我专注于the multi with (Mixy:D $a,QuantHash:D $b)
signature.这告诉我结果应该保持Mixy,即医生的暗示它会或者可能会去Baggy是一个红鲱鱼.
>我回到了代码,开始想知道我能做些什么.当我最初尝试使用()=来简化主要赋值时,编译器抱怨期望MixHash但得到了Mix.我尝试了六个不起作用的东西然后只是将$dim-mix上的MixHash约束更改为Mixy并且它起作用了.
>然后我仔细考虑了发生了什么,并意识到几乎所有类型都阻碍了P6做正确的事情.
如果确实需要,可以添加一些类型.
(但你真的需要它们吗?当类型是绝对必要的时候它们是伟大的.否则,imo,三思而后,再两次,然后再介绍它们.它们很容易使代码更难阅读,推理,撰写和更慢.)
(当然,在某些情况下,它们并不是绝对必要的,但确实对整体有所帮助.Imo,就像所有事情一样,一开始就保持简单,只有当你看到特定代码行的明显好处时才会复杂化.)