โดยปกติวิธีลด, พับ, สแกนจะทำงานโดยการรวบรวมข้อมูลบนซ้ายและทำการเปลี่ยนแปลงตัวแปร RIGHT ต่อไป ความแตกต่างที่สำคัญระหว่างพวกเขาคือ REDUCE, FOLD คือ: -
พับจะเริ่มต้นด้วยseed
ค่าเช่นผู้ใช้กำหนดค่าเริ่มต้น ลดจะโยนข้อยกเว้นถ้าคอลเลกชันว่างเปล่าที่เป็นเท่าให้กลับค่าเมล็ด จะส่งผลให้ค่าเดียวเสมอ
การสแกนใช้สำหรับลำดับการประมวลผลบางรายการจากด้านซ้ายหรือด้านขวาจากนั้นเราสามารถใช้ผลลัพธ์ก่อนหน้าในการคำนวณครั้งต่อไป นั่นหมายความว่าเราสามารถสแกนรายการต่างๆ จะส่งผลให้เกิดการรวบรวม
- วิธี LEFT_REDUCE ทำงานคล้ายกับวิธีการ REDUCE
RIGHT_REDUCE อยู่ฝั่งตรงข้ามเพื่อลดซ้ายหนึ่งคือมันจะเก็บค่าเป็น RIGHT และเปลี่ยนตัวแปรซ้ายไปเรื่อย ๆ
lessLeftOption และ reductionRightOption คล้ายกับ left_reduce และ right_reduce ความแตกต่างเพียงอย่างเดียวคือพวกเขากลับผลลัพธ์ในวัตถุตัวเลือก
ส่วนหนึ่งของการส่งออกสำหรับรหัสที่กล่าวถึงด้านล่างจะเป็น: -
ใช้scan
การดำเนินการมากกว่ารายการหมายเลข (ใช้seed
ค่า0
)List(-2,-1,0,1,2)
{0, -2} => - 2 {-2, -1} => - 3 {-3,0} => - 3 {-3,1} => - 2 {-2,2} => 0 รายการสแกน (0, -2, -3, -3, -2, 0)
{0, -2} => - 2 {-2, -1} => - 3 {-3,0} => - 3 {-3,1} => - 2 {-2,2} => 0 scanLeft (a + b) รายการ (0, -2, -3, -3, -2, 0)
{0, -2} => - 2 {-2, -1} => - 3 {-3,0} => - 3 {-3,1} => - 2 {-2,2} => 0 scanLeft (b + a) รายการ (0, -2, -3, -3, -2, 0)
{2,0} => 2 {1,2} => 3 {0,3} => 3 {-1,3} => 2 {-2,2} => 0 scanRight (a + b) รายการ ( 0, 2, 3, 3, 2, 0)
{2,0} => 2 {1,2} => 3 {0,3} => 3 {-1,3} => 2 {-2,2} => 0 scanRight (b + a) รายการ ( 0, 2, 3, 3, 2, 0)
โดยใช้reduce
, fold
การดำเนินงานในช่วงรายการสตริงList("A","B","C","D","E")
- {A, B} => AB {AB, C} => ABC {ABC, D} => ABCD {ABCD, E} => ABCDE ลด (a + b) ABCDE
- {A, B} => AB {AB, C} => ABC {ABC, D} => ABCD {ABCD, E} => ABCDE ลดระดับ (a + b) ABCDE
- {A, B} => BA {BA, C} => CBA {CBA, D} => DCBA {DCBA, E} => EDCBA ลดระดับ (b + a) EDCB
- {D, E} => DE {C, DE} => CDE {B, CDE} => BCDE {A, BCDE} => ABCDE reducRight (a + b) ABCDE
- {D, E} => ED {C, ED} => EDC {B, EDC} => EDCB {A, EDCB} => EDCBA reducRight (b + a) EDCBA
รหัส:
object ScanFoldReduce extends App {
val list = List("A","B","C","D","E")
println("reduce (a+b) "+list.reduce((a,b)=>{
print("{"+a+","+b+"}=>"+ (a+b)+" ")
a+b
}))
println("reduceLeft (a+b) "+list.reduceLeft((a,b)=>{
print("{"+a+","+b+"}=>"+ (a+b)+" ")
a+b
}))
println("reduceLeft (b+a) "+list.reduceLeft((a,b)=>{
print("{"+a+","+b+"}=>"+ (b+a)+" " )
b+a
}))
println("reduceRight (a+b) "+list.reduceRight((a,b)=>{
print("{"+a+","+b+"}=>"+ (a+b)+" " )
a+b
}))
println("reduceRight (b+a) "+list.reduceRight((a,b)=>{
print("{"+a+","+b+"}=>"+ (b+a)+" ")
b+a
}))
println("scan "+list.scan("[")((a,b)=>{
print("{"+a+","+b+"}=>"+ (a+b)+" " )
a+b
}))
println("scanLeft (a+b) "+list.scanLeft("[")((a,b)=>{
print("{"+a+","+b+"}=>"+ (a+b)+" " )
a+b
}))
println("scanLeft (b+a) "+list.scanLeft("[")((a,b)=>{
print("{"+a+","+b+"}=>"+ (b+a)+" " )
b+a
}))
println("scanRight (a+b) "+list.scanRight("[")((a,b)=>{
print("{"+a+","+b+"}=>"+ (a+b)+" " )
a+b
}))
println("scanRight (b+a) "+list.scanRight("[")((a,b)=>{
print("{"+a+","+b+"}=>"+ (b+a)+" " )
b+a
}))
//Using numbers
val list1 = List(-2,-1,0,1,2)
println("reduce (a+b) "+list1.reduce((a,b)=>{
print("{"+a+","+b+"}=>"+ (a+b)+" ")
a+b
}))
println("reduceLeft (a+b) "+list1.reduceLeft((a,b)=>{
print("{"+a+","+b+"}=>"+ (a+b)+" ")
a+b
}))
println("reduceLeft (b+a) "+list1.reduceLeft((a,b)=>{
print("{"+a+","+b+"}=>"+ (b+a)+" " )
b+a
}))
println(" reduceRight (a+b) "+list1.reduceRight((a,b)=>{
print("{"+a+","+b+"}=>"+ (a+b)+" " )
a+b
}))
println(" reduceRight (b+a) "+list1.reduceRight((a,b)=>{
print("{"+a+","+b+"}=>"+ (b+a)+" ")
b+a
}))
println("scan "+list1.scan(0)((a,b)=>{
print("{"+a+","+b+"}=>"+ (a+b)+" " )
a+b
}))
println("scanLeft (a+b) "+list1.scanLeft(0)((a,b)=>{
print("{"+a+","+b+"}=>"+ (a+b)+" " )
a+b
}))
println("scanLeft (b+a) "+list1.scanLeft(0)((a,b)=>{
print("{"+a+","+b+"}=>"+ (b+a)+" " )
b+a
}))
println("scanRight (a+b) "+list1.scanRight(0)((a,b)=>{
print("{"+a+","+b+"}=>"+ (a+b)+" " )
a+b}))
println("scanRight (b+a) "+list1.scanRight(0)((a,b)=>{
print("{"+a+","+b+"}=>"+ (a+b)+" " )
b+a}))
}