Mengekspresikan urutan penjumlahan ganda dalam Raku

13

Bagaimana cara mengekspresikan urutan penjumlahan ganda variabel ganda dalam Perl 6?

Untuk contoh urutan penjumlahan ganda variabel ganda lihat ini

gambar

Itu harus dinyatakan apa adanya, yaitu tanpa secara matematis mengurangi penjumlahan ganda menjadi penjumlahan tunggal. Terima kasih.

Lars Malmsteen
sumber

Jawaban:

14

The X(lintas operator) dan [+](pengurangan metaoperator [ ]dengan operator tambahan +) membuat ini sangat mudah:

Untuk mewakili 1 penjumlahan ganda ³ x  = 1y  = 1 2x + y , Anda dapat melakukan hal berikut:

  [+] 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

Jika Anda ingin membuat subini, Anda dapat menuliskannya sebagai berikut 2

sub ΣΣ (
    Int $aₒ, Int $aₙ,     # to / from for the outer
    Int $bₒ, Int $bₙ,     # to / from for the inner
    &f where .arity = 2   # 'where' clause guarantees only two params
) {
  [+] do for $aₒ..$aₙ X $bₒ..$bₙ -> ($a, $b) { &f(a,b) }
}

say ΣΣ 1,3, 1,5, { 2 * $^x + $^y }

Atau bahkan menyederhanakan banyak hal

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 ;-) 

Perhatikan bahwa dengan mengetiknya, kami dapat memastikan rentang dilewati, tetapi dengan mengetiknya sebagai Iterableganti Rangekami dapat memungkinkan urutan penjumlahan yang lebih menarik, seperti, katakanlah,ΣΣ (1..∞).grep(*.is-prime)[^99], 1..10, { … } yang akan memungkinkan kami menggunakan urutan dari 100 bilangan prima pertama.

Bahkan, jika kita benar-benar menginginkannya, kita bisa pergi ke laut, dan memungkinkan operator penjumlahan kedalaman sewenang-wenang, yang dibuat paling mudah dengan memindahkan fungsi ke kiri:

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;
};

Sama seperti [+]meringkas semua nilai f()fungsi kita , [X]menghitung tanda silang secara iteratif, misalnya, [X] 0..1, 3..4, 5..6pertama melakukan 0..1 X 3..4atau (0,3),(0,4),(1,3),(1,4), dan kemudian (0,3),(0,4),(1,3),(1,4) X 5..6, atau (0,3,5),(0,4,5),(1,3,5),(1,4,5),(0,3,6),(0,4,6),(1,3,6),(1,4,6).


1. Maaf, SO tidak membiarkan saya melakukan LaTeX, tetapi Anda harus mendapatkan idenya. 2. Ya, saya tahu itu huruf subskrip O bukan nol, biasanya nomor subskrip tidak sah, tetapi Anda dapat menggunakan Slang :: Subskrip untuk mengaktifkannya.

pengguna0721090601
sumber