โมนาด IO
ผลข้างเคียงบริสุทธิ์
โมนาด IO เป็นบทเรียน Scala for Backend Engineering & Functional Programming ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Scala for Backend Engineering & Functional Programming และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน
IO คืออะไร
IO[A] จาก Cats Effect คือ คำอธิบาย ของการคำนวณที่เมื่อเรียกใช้แล้วอาจก่อให้เกิดผลกระทบข้างเคียงและสร้างค่าชนิด A โดยตัวมันเป็นค่าบริสุทธิ์ — จะไม่มีอะไรเกิดขึ้นจนกว่าคุณจะเรียกใช้
เลื่อนการทำงานของผลกระทบข้างเคียง
ห่อผลกระทบข้างเคียงด้วย IO(...) หรือ IO.delay(...) เนื้อหาภายในจะ ไม่ทำงานเมื่อสร้าง IO แต่จะทำงานเมื่อมีการเรียกใช้เท่านั้น
import cats.effect.IO
val program: IO[Unit] = IO(println("Hello, IO!"))
// Nothing printed yet — program is just a descriptionความโปร่งใสเชิงอ้างอิง
เนื่องจาก IO ประเมินผลแบบขี้เกียจ คุณจึงแทนค่าของ IO ด้วยนิยามของมันได้โดยไม่เปลี่ยนพฤติกรรม ความโปร่งใสเชิงอ้างอิงนี้ทำให้โค้ดที่มีผลกระทบเข้าใจและปรับโครงสร้างได้ง่ายขึ้น
ค่าบริสุทธิ์
ใช้ IO.pure เพื่อยกค่าที่ คำนวณเสร็จแล้วเข้าไป อย่าใส่ผลกระทบข้างเคียงไว้ใน pure — เพราะมันประเมินผลทันที ให้ใช้ IO.delay หรือ IO(...) สำหรับผลกระทบ
import cats.effect.IO
val p: IO[Int] = IO.pure(42)
// 42 is computed already; pure just wraps itmap และ as
map แปลงผลลัพธ์ของ IO ส่วน as แทนที่ผลลัพธ์ด้วยค่าคงที่ ทั้งสองอย่างไม่เรียกใช้ผลกระทบ แต่สร้างคำอธิบายที่ใหญ่ขึ้น
import cats.effect.IO
val len: IO[Int] = IO("hello").map(_.length)
val done: IO[String] = IO(println("ran")).as("done")การเรียกใช้ด้วย IOApp
หากต้องการเรียกใช้โปรแกรม IO ให้สืบทอดจาก IOApp และใช้งาน run โดยคืนค่าเป็น IO[ExitCode] รันไทม์จะประเมินผลบนตัวจัดตารางเวลาที่ใช้ไฟเบอร์
import cats.effect.{IO, IOApp, ExitCode}
object Main extends IOApp {
def run(args: List[String]): IO[ExitCode] =
IO(println("Running!")).as(ExitCode.Success)
}IOApp.Simple
สำหรับโปรแกรมที่ไม่มีอาร์กิวเมนต์หรือรหัสการออกแบบกำหนดเอง ให้สืบทอดจาก IOApp.Simple และจัดเตรียม run: IO[Unit]
import cats.effect.{IO, IOApp}
object Hello extends IOApp.Simple {
def run: IO[Unit] = IO.println("Hello, world!")
}IO.println
Cats Effect มี IO.println สำหรับการพิมพ์ที่มีผลกระทบอย่างสะดวก โดยคืนค่า IO[Unit] และจะพิมพ์เมื่อมีการเรียกใช้เท่านั้น
import cats.effect.IO
val greet: IO[Unit] = IO.println("effectful output")การดักจับข้อยกเว้น
หากผลกระทบที่ห่อไว้ทำให้เกิดข้อยกเว้น ความล้มเหลวจะถูกเก็บไว้ภายใน IO แทนที่จะหลุดออกมา IO จะกลายเป็นค่าที่ล้มเหลวซึ่งคุณจัดการได้ภายหลัง
import cats.effect.IO
val boom: IO[Int] = IO(throw new RuntimeException("fail"))
// Creating boom does NOT throw; running it wouldการเปรียบเทียบกับ Scala ปกติ
หากไม่มีชนิดผลกระทบ ผลกระทบข้างเคียงจะทำงานทันทีและประกอบเข้าด้วยกันได้ยาก IO จะเลื่อนการทำงานออกไป ดังนั้นโปรแกรม Scala แบบครบในตัวจะพิมพ์ทันที ขณะที่ IO จะเลื่อนการพิมพ์
object Main {
def main(args: Array[String]): Unit = {
val eager = println("runs now") // executed immediately
println("second line")
}
}เหตุใดจึงใช้ IO
IO มอบสิ่งต่อไปนี้:
- ความบริสุทธิ์ — ผลกระทบเป็นค่า
- ความสามารถในการประกอบ — สร้างโปรแกรมจากส่วนย่อย ๆ
- ความปลอดภัย — ติดตามข้อผิดพลาดและทรัพยากร
- การทำงานพร้อมกัน — ใช้ไฟเบอร์น้ำหนักเบา
ตรวจสอบอย่างรวดเร็ว
ผลกระทบข้างเคียงภายใน IO(println("hi")) จะทำงานจริงเมื่อใด
สรุปทบทวน
มอนาด IO จำลองผลกระทบเป็นค่าบริสุทธิ์ที่ประเมินผลแบบขี้เกียจ:
IO(...)/IO.delayเลื่อนผลกระทบออกไปIO.pureห่อค่าที่คำนวณแล้วIOApp/IOApp.Simpleเรียกใช้โปรแกรม- ข้อยกเว้นถูกเก็บไว้ ไม่ได้ถูกโยนออกมาทันที
ถัดไป: การประกอบการทำงานของ IO หลายรายการเข้าด้วยกัน
คำถามที่พบบ่อย
บทเรียน “โมนาด IO” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “โมนาด IO” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Scala for Backend Engineering & Functional Programming ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “โมนาด IO”
ผลข้างเคียงบริสุทธิ์ คุณปฏิบัติ Scala for Backend Engineering & Functional Programming ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Scala for Backend Engineering & Functional Programming หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Scala for Backend Engineering & Functional Programming บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “โมนาด IO” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Scala for Backend Engineering & Functional Programming นี้ได้ไหม
ได้ บทเรียน Scala for Backend Engineering & Functional Programming ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ