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

โมนาด 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 it

map และ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. คลาสของชนิดใน Cats
  2. โมนาด IO
  3. การประกอบ IO
  4. การจัดการข้อผิดพลาดใน IO
← กลับไปที่ Scala for Backend Engineering & Functional Programming