0Pricing
Scala for Backend Engineering & Functional Programming · บทเรียน

การประกอบฟังก์ชัน

andThen และ compose

การประกอบฟังก์ชัน เป็นบทเรียน Scala for Backend Engineering & Functional Programming ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Scala for Backend Engineering & Functional Programming และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน

การรวมฟังก์ชัน

การประกอบฟังก์ชันหมายถึงการสร้างฟังก์ชันใหม่โดยเชื่อมฟังก์ชันที่มีอยู่สองฟังก์ชันเข้าด้วยกัน ทำให้ผลลัพธ์ของฟังก์ชันหนึ่งกลายเป็นอินพุตของอีกฟังก์ชัน Scala มี andThen และ compose สำหรับงานนี้

object Main {
  def main(args: Array[String]): Unit = {
    val addOne = (x: Int) => x + 1
    val double = (x: Int) => x * 2
    val both = addOne andThen double
    println(both(5))
  }
}

andThen: จากซ้ายไปขวา

f andThen g เรียกใช้ f ก่อน แล้วจึงเรียก g การอ่านจากซ้ายไปขวาสอดคล้องกับลำดับการทำงาน ซึ่งหลายคนมองว่าเข้าใจง่าย

  • (f andThen g)(x) == g(f(x))
object Main {
  def main(args: Array[String]): Unit = {
    val addOne = (x: Int) => x + 1
    val triple = (x: Int) => x * 3
    val pipeline = addOne andThen triple
    println(pipeline(4))  // (4 + 1) * 3
  }
}

compose: จากขวาไปซ้าย

f compose g เรียกใช้ g ก่อน แล้วจึงเรียก f ซึ่งเป็นลำดับทางคณิตศาสตร์ f(g(x))

  • (f compose g)(x) == f(g(x))
object Main {
  def main(args: Array[String]): Unit = {
    val addOne = (x: Int) => x + 1
    val triple = (x: Int) => x * 3
    val pipeline = addOne compose triple
    println(pipeline(4))  // (4 * 3) + 1
  }
}

andThen เทียบกับ compose

ทั้งสองเป็นภาพสะท้อนของกันและกัน:

  • f andThen g = g compose f
  • f compose g = g andThen f

เลือกใช้รูปแบบที่อ่านเป็นธรรมชาติกว่าสำหรับสถานการณ์ของคุณ

object Main {
  def main(args: Array[String]): Unit = {
    val f = (x: Int) => x + 10
    val g = (x: Int) => x * 2
    println((f andThen g)(3))
    println((g compose f)(3))
  }
}

การเชื่อมฟังก์ชันหลายฟังก์ชัน

คุณสามารถเชื่อมฟังก์ชันหลายฟังก์ชันด้วย andThen ที่เรียกซ้ำกัน เพื่อสร้างกระบวนการต่อเนื่องที่ยาวขึ้นและไหลจากบนลงล่าง

object Main {
  def main(args: Array[String]): Unit = {
    val clean = (s: String) => s.trim
    val lower = (s: String) => s.toLowerCase
    val bang  = (s: String) => s + "!"
    val process = clean andThen lower andThen bang
    println(process("  HELLO  "))
  }
}

การประกอบทำให้ชนิดเปลี่ยนไป

ฟังก์ชันที่นำมาประกอบกันต้องมีชนิดที่เข้ากันได้ ชนิดผลลัพธ์ของฟังก์ชันแรกต้องตรงกับชนิดอินพุตของฟังก์ชันที่สอง กระบวนการต่อเนื่องอาจเปลี่ยนชนิดไปตลอดทาง

object Main {
  def main(args: Array[String]): Unit = {
    val length = (s: String) => s.length
    val isLong = (n: Int) => n > 5
    val check = length andThen isLong
    println(check("scala"))
    println(check("functional"))
  }
}

ฟังก์ชันเอกลักษณ์

identity จะคืนค่าอินพุตเดิมโดยไม่เปลี่ยนแปลง เป็นสมาชิกเอกลักษณ์ของการประกอบฟังก์ชัน: f andThen identity == f มีประโยชน์สำหรับใช้เป็นค่าเริ่มต้นในฟังก์ชันพับและเงื่อนไข

object Main {
  def main(args: Array[String]): Unit = {
    val f = (x: Int) => x * 2
    val same = f andThen identity[Int]
    println(same(7))
  }
}

การประกอบด้วย reduce

เนื่องจากฟังก์ชันเป็นค่าได้ คุณจึงเก็บฟังก์ชันหลายรายการไว้ในรายการ แล้วประกอบฟังก์ชันทั้งหมดได้โดยใช้ reduce ร่วมกับ andThen

object Main {
  def main(args: Array[String]): Unit = {
    val steps: List[Int => Int] = List(_ + 1, _ * 2, _ - 3)
    val pipeline = steps.reduce(_ andThen _)
    println(pipeline(5))  // ((5+1)*2)-3
  }
}

การสร้างสายงานที่นำกลับมาใช้ใหม่ได้

การประกอบฟังก์ชันส่งเสริมให้สร้างฟังก์ชันขนาดเล็กที่มีจุดประสงค์เดียว แล้วนำมาประกอบเป็นการทำงานที่ใหญ่ขึ้น ซึ่งเป็นแนวคิดสำคัญในการเขียนโปรแกรมเชิงฟังก์ชัน

object Main {
  def main(args: Array[String]): Unit = {
    val sanitize = (s: String) => s.trim.toLowerCase
    val capitalize = (s: String) => s.capitalize
    val format = sanitize andThen capitalize
    println(format("  aLiCe "))
  }
}

การประกอบกับ map

ฟังก์ชันที่ประกอบแล้วก็เป็นเพียงฟังก์ชันหนึ่ง ดังนั้นคุณจึงส่งฟังก์ชันนั้นให้ map ได้โดยตรง เพื่อใช้สายงานทั้งหมดกับสมาชิกทุกตัวในคอลเลกชัน

object Main {
  def main(args: Array[String]): Unit = {
    val transform = ((x: Int) => x + 1) andThen ((x: Int) => x * x)
    println(List(1, 2, 3).map(transform))
  }
}

อ่านลำดับการประกอบอย่างรอบคอบ

ข้อผิดพลาดที่พบบ่อยคือการสับสนระหว่าง andThen กับ compose โปรดจำไว้เสมอว่า andThen = ทำสิ่งนี้ก่อน แล้วจึงทำสิ่งนั้น ส่วน compose = ทำในลำดับย้อนกลับ

object Main {
  def main(args: Array[String]): Unit = {
    val inc = (x: Int) => x + 1
    val sqr = (x: Int) => x * x
    println((inc andThen sqr)(2))  // (2+1)^2 = 9
    println((inc compose sqr)(2))  // (2^2)+1 = 5
  }
}

ตรวจสอบอย่างรวดเร็ว

กำหนดให้มี f และ g แล้ว (f andThen g)(x) คำนวณอะไร

สรุปทบทวน

คุณได้เรียนรู้การประกอบฟังก์ชันดังนี้:

  • f andThen g → g(f(x)) (จากซ้ายไปขวา)
  • f compose g → f(g(x)) (จากขวาไปซ้าย)
  • ทั้งสองแบบเป็นภาพสะท้อนของกันและกัน
  • identity เป็นสมาชิกเอกลักษณ์
  • ประกอบรายการฟังก์ชันด้วย reduce(_ andThen _)

คำถามที่พบบ่อย

บทเรียน “การประกอบฟังก์ชัน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การประกอบฟังก์ชัน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Scala for Backend Engineering & Functional Programming ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การประกอบฟังก์ชัน”

andThen และ compose คุณปฏิบัติ Scala for Backend Engineering & Functional Programming ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Scala for Backend Engineering & Functional Programming หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Scala for Backend Engineering & Functional Programming บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การประกอบฟังก์ชัน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Scala for Backend Engineering & Functional Programming นี้ได้ไหม

ได้ บทเรียน Scala for Backend Engineering & Functional Programming ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ฟังก์ชันในฐานะค่า
  2. การทำเคอร์รี
  3. การประกอบฟังก์ชัน
  4. โคลเชอร์
← กลับไปที่ Scala for Backend Engineering & Functional Programming