Math 用Raku表示双求和序列
如何在Perl 6中表示双变量双求和序列 有关双变量双求和序列的示例,请参见 它必须按原样表示,即在不从数学上将双重求和减少为单一求和的情况下。谢谢。X(交叉运算符)和Math 用Raku表示双求和序列,math,raku,Math,Raku,如何在Perl 6中表示双变量双求和序列 有关双变量双求和序列的示例,请参见 它必须按原样表示,即在不从数学上将双重求和减少为单一求和的情况下。谢谢。X(交叉运算符)和[+](带加法运算符的归约元运算符[])使这一操作变得异常简单: 表示双重总和∑³x = 1.∑⁵Y = 1 2x+y,您可以执行以下操作: [+] do for 1..3 X 1..5 -> ($x, $y) { 2 * $x + $y } # for 1..3 X 1..5
[+]
(带加法运算符的归约元运算符[]
)使这一操作变得异常简单:
表示双重总和∑³x = 1.∑⁵Y = 1 2x+y,您可以执行以下操作:
[+] do for 1..3 X 1..5 -> ($x, $y) { 2 * $x + $y }
# for 1..3 X 1..5 # loop cross values
# -> ($x, $y) # plug into x/y
# { 2 * $x + $y } # calculate each iteration
# do # collect loop return vals
# [+] # sum them all
如果您想为此创建一个子,可以按如下方式编写
甚至把事情简化为
sub ΣΣ (
Iterable \a, # outer values
Iterable \b, # inner values
&f where .arity = 2) { # ensure only two parameters
[+] do f(|$_) for a X b
}
# All of the following are equivalent
say ΣΣ 1..3, 1..5, -> $x, $y { 2 * $x + $y }; # Anonymous block
say ΣΣ 1..3, 1..5, { 2 * $^x + $^y }; # Alphabetic args
say ΣΣ 1..3, 1..5, 2 * * + * ; # Overkill, but Whatever ;-)
注意,通过键入它,我们可以确保传递范围,但是通过将其键入为Iterable
而不是Range
我们可以允许更有趣的求和序列,比如说,∑∑(1。。∞).grep(*.is prime)[^99],1..10,{…}
这将允许我们使用前100个prime的序列
事实上,如果我们真的想,我们可以走得太远,允许使用任意深度求和运算符,通过将函数向左移动,这是最简单的:
sub ΣΣ (
&function,
**@ranges where # slurp in the ranges
.all ~~ Iterable && # make sure they're Iterables
.elems == &function.arity # one per argument in the function
) {
[+] do function(|$_) for [X] @ranges;
};
就像[+]
对我们的f()
函数的所有值求和一样,[X]
以交叉迭代的方式计算,例如,[X]0..1,3..4,5..6
首先执行0..1 X 3..4
或(0,3),(0,4),(1,3),(1,4)
,然后执行(0,3),(0,4),(1,3),(1,4),,(1,4,5)、(0,3,6)、(0,4,6)、(1,3,6)、(1,4,6)
1。对不起,所以不让我做LaTeX,但你应该明白。2。是的,我知道这是一个下标字母O而不是零,下标数字通常不是有效的标识符,但你可以使用来启用它们
sub ΣΣ (
&function,
**@ranges where # slurp in the ranges
.all ~~ Iterable && # make sure they're Iterables
.elems == &function.arity # one per argument in the function
) {
[+] do function(|$_) for [X] @ranges;
};