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
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.
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
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:
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 sub
cho 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ó Iterable
thay vì Range
chú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..4
hoặ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.