Math 用Raku表示双求和序列

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

如何在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                             # 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;
};