มีบางสิ่งที่ต้องพูดถึงที่นี่ก่อนที่จะให้คำตอบจริง:
- คำถามของคุณไม่มีอะไรเกี่ยวข้องกับ
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(ซึ่งโดยวิธีการที่บางครั้งคุณสามารถแสดงสิ่งเดียวกันโดยใช้อย่างใดอย่างหนึ่ง)
เมื่อคุณเรียกใช้reduceLeftSay บน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 ด้วยรายการจำนวนเต็มและผลรวม โดยวิธีการที่รายการจะถูกส่งกลับไปข้างหลังเพราะเราใช้แทนfoldLeftfoldRight
ดูOne Fold เพื่อควบคุมทั้งหมดสำหรับคำอธิบายเชิงลึก