มีบางสิ่งที่ต้องพูดถึงที่นี่ก่อนที่จะให้คำตอบจริง:
- คำถามของคุณไม่มีอะไรเกี่ยวข้องกับ
left
มันค่อนข้างเกี่ยวกับความแตกต่างระหว่างการลดและการพับ
- ความแตกต่างไม่ใช่การใช้งานเลยเพียงแค่ดูที่ลายเซ็น
- คำถามไม่มีส่วนเกี่ยวข้องกับ Scala โดยเฉพาะมันค่อนข้างเกี่ยวกับสองแนวคิดของการเขียนโปรแกรมเชิงฟังก์ชัน
กลับไปที่คำถามของคุณ:
นี่คือลายเซ็นของfoldLeft
(อาจเป็นfoldRight
สำหรับจุดที่ฉันจะทำด้วย):
def foldLeft [B] (z: B)(f: (B, A) => B): B
และนี่คือลายเซ็นต์ของreduceLeft
(อีกทิศทางไม่สำคัญที่นี่)
def reduceLeft [B >: A] (f: (B, A) => B): B
ทั้งสองดูคล้ายกันมากและทำให้เกิดความสับสน reduceLeft
เป็นกรณีพิเศษของfoldLeft
(ซึ่งโดยวิธีการที่บางครั้งคุณสามารถแสดงสิ่งเดียวกันโดยใช้อย่างใดอย่างหนึ่ง)
เมื่อคุณเรียกใช้reduceLeft
Say บนList[Int]
ตัวอักษรมันจะลดรายการทั้งหมดของจำนวนเต็มเป็นค่าเดียวซึ่งจะเป็นประเภทInt
(หรือประเภทของInt
ดังนั้น[B >: A]
)
เมื่อคุณโทรfoldLeft
พูดบนList[Int]
มันจะพับรายการทั้งหมด (ลองนึกภาพม้วนกระดาษ) เป็นค่าเดียว แต่ค่านี้ไม่จำเป็นต้องเกี่ยวข้องแม้แต่กับInt
(ดังนั้น[B]
)
นี่คือตัวอย่าง:
def listWithSum(numbers: List[Int]) = numbers.foldLeft((List.empty[Int], 0)) {
(resultingTuple, currentInteger) =>
(currentInteger :: resultingTuple._1, currentInteger + resultingTuple._2)
}
วิธีการนี้จะใช้เวลาList[Int]
และผลตอบแทนหรือTuple2[List[Int], Int]
(List[Int], Int)
มันคำนวณผลรวมและส่งกลับ tuple ด้วยรายการจำนวนเต็มและผลรวม โดยวิธีการที่รายการจะถูกส่งกลับไปข้างหลังเพราะเราใช้แทนfoldLeft
foldRight
ดูOne Fold เพื่อควบคุมทั้งหมดสำหรับคำอธิบายเชิงลึก