Thể hiện chuỗi tổng hợp kép trong Raku


13

Làm thế nào để diễn tả chuỗi tổng hai biến kép trong Perl 6?

Để biết ví dụ về trình tự tổng hợp kép biến kép, hãy xem

hình ảnh

Nó phải được thể hiện như là, tức là không có toán học giảm tổng cộng thành một tổng. Cảm ơn bạn.

Câu trả lời:


14

Các X(cross điều hành) và [+](metaoperator giảm [ ]với nhà điều hành phụ +) làm cho điều này đáng ngạc nhiên dễ dàng:

Đại diện cho 1 tổng đôi Σ³ x  = 1 Σ⁵ y  = 1 2x + y , bạn có thể làm như sau:

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

Nếu bạn muốn tạo một cái subcho cái này, bạn có thể viết nó như 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 }

Hoặc thậm chí đơn giản hóa mọi thứ nhiều hơn để

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

Lưu ý rằng bằng cách nhập nó, chúng ta có thể đảm bảo các phạm vi được thông qua, nhưng bằng cách nhập nó Iterablethay vì Rangechúng ta có thể cho phép các chuỗi tổng hợp thú vị hơn, như, giả sử, ΣΣ (1..∞).grep(*.is-prime)[^99], 1..10, { … }sẽ cho phép chúng ta sử dụng chuỗi 100 số nguyên tố đầu tiên.

Trong thực tế, nếu chúng ta thực sự muốn, chúng ta có thể quá nhiệt tình và cho phép một toán tử tổng hợp độ sâu tùy ý, được thực hiện dễ dàng nhất bằng cách di chuyển hàm sang trái:

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

Giống như [+]tổng hợp tất cả các giá trị của f()hàm của chúng ta , [X]tính toán chéo lặp đi lặp lại, ví dụ, [X] 0..1, 3..4, 5..6đầu tiên là 0..1 X 3..4hoặc (0,3),(0,4),(1,3),(1,4), sau đó (0,3),(0,4),(1,3),(1,4) X 5..6, hoặc (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. Xin lỗi, SO không cho tôi làm LaTeX, nhưng bạn nên lấy ý tưởng. 2. Có, tôi biết đó là chữ cái đăng ký O không phải là số 0, số đăng ký không phải là định danh hợp lệ thông thường, nhưng bạn có thể sử dụng Slang :: Thuê bao để kích hoạt chúng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.