วิธีการแสดงลำดับคู่บวกคู่ตัวแปรใน Perl 6?
สำหรับตัวอย่างของตัวแปร double summation doubleดูได้
มันจะต้องแสดงตามที่เป็นอยู่คือไม่มีการลดลงในการรวมคู่เดียวทางคณิตศาสตร์ ขอบคุณ.
วิธีการแสดงลำดับคู่บวกคู่ตัวแปรใน Perl 6?
สำหรับตัวอย่างของตัวแปร double summation doubleดูได้
มันจะต้องแสดงตามที่เป็นอยู่คือไม่มีการลดลงในการรวมคู่เดียวทางคณิตศาสตร์ ขอบคุณ.
คำตอบ:
X
(ผู้ประกอบการข้าม) และ[+]
(metaoperator ลด[ ]
กับผู้ประกอบการสารเติมแต่ง+
) ทำให้เรื่องนี้น่าแปลกใจที่ง่าย:
ในการแทน1การรวมคู่∑³ 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
นี้คุณสามารถเขียนได้ดังต่อไปนี้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 }
หรือทำให้สิ่งต่าง ๆ ง่ายขึ้นไปอีก
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 ครั้งแรก
ในความเป็นจริงถ้าเราต้องการจริงๆเราสามารถไปลงน้ำและอนุญาตให้ผู้ประกอบการรวมความลึกโดยพลการซึ่งทำง่ายที่สุดโดยการย้ายฟังก์ชั่นไปทางซ้าย:
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) X 5..6
(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.ขออภัยดังนั้นอย่าปล่อยให้ฉันทำ LaTeX แต่คุณควรได้รับแนวคิด 2.ใช่ฉันรู้ว่าเป็นตัวอักษรตัวห้อย O ไม่ใช่ตัวเลขตัวห้อยไม่ใช่ตัวระบุที่ถูกต้องตามปกติ แต่คุณสามารถใช้คำสแลง :: ตัวห้อยเพื่อเปิดใช้งานได้