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

ตัวสร้างหลายตัว

การวนซ้ำแบบซ้อน

ตัวสร้างหลายตัว เป็นบทเรียน 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 บทเรียน

การวนซ้ำซ้อนกันทำให้แบนราบ

for-comprehension สามารถมี ตัวสร้าง ได้หลายตัว แต่ละตัวคือบรรทัด <- ที่วนซ้ำผ่านคอลเลกชัน เมื่อนำมารวมกัน ตัวสร้างเหล่านี้จะสร้างชุดผสมที่เป็นไปได้ทุกแบบ ซึ่งคล้ายลูปซ้อนกันที่เขียนให้อยู่ในรูปแบบแบนราบ

object Main {
  def main(args: Array[String]): Unit = {
    val pairs = for {
      x <- List(1, 2)
      y <- List('a', 'b')
    } yield (x, y)
    println(pairs)
  }
}

นี่คือผลคูณคาร์ทีเซียน

ตัวสร้างสองตัวที่มีขนาด m และ n จะสร้างผลลัพธ์ m × n รายการ ซึ่งเป็น ผลคูณคาร์ทีเซียน ทั้งหมด ตัวสร้างแรกคือลูปภายนอก และตัวสร้างที่สองคือลูปภายใน

object Main {
  def main(args: Array[String]): Unit = {
    val grid = for {
      row <- 1 to 3
      col <- 1 to 3
    } yield s"r$row-c$col"
    println(grid.mkString(", "))
  }
}

ตัวสร้างภายในสามารถขึ้นอยู่กับตัวสร้างภายนอก

ตัวสร้างที่อยู่ถัดมาสามารถใช้ค่าที่ถูกผูกไว้โดยตัวสร้างก่อนหน้าได้ สิ่งนี้ทำไม่ได้ด้วยผลคูณคาร์ทีเซียนธรรมดา และเป็นเหตุผลหนึ่งที่ทำให้ for-comprehension ยืดหยุ่นมาก

object Main {
  def main(args: Array[String]): Unit = {
    val upperTriangle = for {
      i <- 1 to 4
      j <- i to 4
    } yield (i, j)
    println(upperTriangle)
  }
}

ตัวสร้างสามตัวขึ้นไป

คุณสามารถวางตัวสร้างต่อกันได้มากเท่าที่ต้องการ ตัวสร้างสามตัวจะให้ลูปซ้อนกันสามชั้น ซึ่งสร้างทูเพิลหรือค่าที่คำนวณแล้ว

object Main {
  def main(args: Array[String]): Unit = {
    val triples = for {
      a <- 1 to 2
      b <- 1 to 2
      c <- 1 to 2
    } yield (a, b, c)
    println(triples.size + " combinations")
    triples.foreach(println)
  }
}

ตัวอย่างพีทาโกรัสคลาสสิก

การใช้งานที่มีชื่อเสียงอย่างหนึ่งคือการค้นหาจำนวนสามพีทาโกรัส เราจะวนผ่านตัวเลขสามจำนวนและเก็บไว้เฉพาะชุดที่ a*a + b*b == c*c โดยใช้ตัวสร้างหลายตัวร่วมกับการ์ด

object Main {
  def main(args: Array[String]): Unit = {
    val triples = for {
      a <- 1 to 20
      b <- a to 20
      c <- b to 20
      if a * a + b * b == c * c
    } yield (a, b, c)
    triples.foreach(println)
  }
}

การแปลงรูป

ตัวสร้างหลายตัวจะกลายเป็นการเรียก flatMap ซ้อนกัน โดยมี map อยู่ท้ายสุด:

  • xs.flatMap(x => ys.flatMap(y => zs.map(z => ...)))

ตัวสร้างเพิ่มเติมแต่ละตัวจะเพิ่มระดับการซ้อนอีกหนึ่งระดับ

object Main {
  def main(args: Array[String]): Unit = {
    val sugar = for {
      x <- List(1, 2)
      y <- List(3, 4)
    } yield x * y
    val desugared = List(1, 2).flatMap(x => List(3, 4).map(y => x * y))
    println(sugar == desugared)
  }
}

การผสมตัวสร้างกับการ์ด

คุณสามารถสลับใช้ตัวสร้างและการ์ดได้อย่างอิสระ การ์ดที่วางอยู่ระหว่างตัวสร้างสองตัวจะตัดค่าจากภายนอกออกก่อนที่ลูปภายในจะเริ่มทำงาน

object Main {
  def main(args: Array[String]): Unit = {
    val result = for {
      x <- 1 to 5
      if x % 2 == 1
      y <- 1 to 5
      if y > x
    } yield (x, y)
    println(result)
  }
}

ทำคอลเลกชันซ้อนกันให้แบนราบ

เมื่อคุณมีคอลเลกชันที่ประกอบด้วยคอลเลกชันอีกที ตัวสร้างสองตัวจะทำให้คอลเลกชันนั้นแบนราบได้อย่างเป็นธรรมชาติ ตัวแรกวนผ่านคอลเลกชันภายนอก ส่วนตัวที่สองวนผ่านคอลเลกชันภายในแต่ละรายการ

object Main {
  def main(args: Array[String]): Unit = {
    val matrix = List(List(1, 2), List(3, 4), List(5, 6))
    val flat = for {
      row <- matrix
      value <- row
    } yield value
    println(flat)
  }
}

การสร้างตารางสตริง

ตัวสร้างหลายตัวเหมาะอย่างยิ่งสำหรับการสร้างผลลัพธ์ที่มีโครงสร้าง เช่น พิกัดหรือตารางสูตรคูณ

object Main {
  def main(args: Array[String]): Unit = {
    val table = for {
      i <- 1 to 3
      j <- 1 to 3
    } yield s"$i*$j=${i * j}"
    println(table.grouped(3).map(_.mkString("  ")).mkString("\n"))
  }
}

การรวมคอลเลกชันที่มีขนาดต่างกัน

ตัวสร้างไม่จำเป็นต้องมีความยาวเท่ากัน ระบบจะสร้างชุดผสมจากองค์ประกอบหนึ่งตัวของแต่ละคอลเลกชัน

object Main {
  def main(args: Array[String]): Unit = {
    val sizes = List("S", "M", "L")
    val colors = List("red", "blue")
    val products = for {
      s <- sizes
      c <- colors
    } yield s"$c-$s"
    println(products)
  }
}

ลำดับมีผลต่อลำดับผลลัพธ์

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

object Main {
  def main(args: Array[String]): Unit = {
    val ab = for { x <- List(1, 2); y <- List(9, 8) } yield (x, y)
    val ba = for { y <- List(9, 8); x <- List(1, 2) } yield (x, y)
    println(ab)
    println(ba)
  }
}

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

for { x <- List(1,2,3); y <- List('a','b') } yield (x, y) สร้างทูเพิลกี่รายการ

สรุปทบทวน

คุณได้เรียนรู้เกี่ยวกับตัวสร้างหลายตัว:

  • แต่ละบรรทัด <- จะเพิ่มระดับการวนซ้ำซ้อนกันหนึ่งระดับ
  • เมื่อนำมารวมกัน ตัวสร้างจะสร้างผลคูณคาร์ทีเซียน
  • ตัวสร้างภายในสามารถขึ้นอยู่กับค่าที่ถูกผูกไว้จากภายนอก
  • ตัวสร้างจะถูกแปลงรูปเป็น flatMap ซ้อนกันและตามด้วย map สุดท้าย
  • ลำดับตัวสร้างจะเปลี่ยนลำดับของผลลัพธ์

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

บทเรียน “ตัวสร้างหลายตัว” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ตัวสร้างหลายตัว”

การวนซ้ำแบบซ้อน คุณปฏิบัติ 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. การคลี่รูป for
  2. การกรองด้วย if
  3. ตัวสร้างหลายตัว
  4. การใช้ร่วมกับ Option และ Future
← กลับไปที่ Scala for Backend Engineering & Functional Programming