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

คลาสของชนิดใน Cats

Functor, Monad และอื่น ๆ

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

คลาสชนิดข้อมูลคืออะไร

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

  • Functor — สิ่งที่สามารถใช้ map ได้
  • Applicative — รวมเอฟเฟกต์ที่เป็นอิสระต่อกัน
  • Monad — เรียงลำดับเอฟเฟกต์ที่ขึ้นต่อกัน

Functor: map

Functor[F]map ซึ่งแปลงค่าภายในบริบทโดยไม่เปลี่ยนโครงสร้างของบริบท

import cats.Functor
import cats.instances.option._

val f = Functor[Option].map(Some(2))(_ + 1)
println(f) // Some(3)

กฎของ Functor

Functor ที่เป็นไปตามกฎต้องปฏิบัติตามกฎสองข้อ:

  • เอกลักษณ์: fa.map(x => x) == fa
  • การประกอบ: fa.map(f).map(g) == fa.map(f.andThen(g))

การรับประกันเหล่านี้ช่วยให้คุณปรับโครงสร้างสายการเรียกใช้ map ได้อย่างปลอดภัย

Applicative: pure และ ap

Applicative[F] สืบทอดจาก Functor และเพิ่ม pure (ยกค่าเข้าไปในบริบท) รวมถึงความสามารถในการรวมค่าที่เป็นอิสระต่อกันด้วย mapN

import cats.Applicative
import cats.instances.option._

val lifted = Applicative[Option].pure(42)
println(lifted) // Some(42)

การรวมค่าด้วย mapN

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

import cats.syntax.apply._
import cats.instances.option._

val result = (Option(1), Option(2), Option(3)).mapN(_ + _ + _)
println(result) // Some(6)

Monad: flatMap

Monad[F] สืบทอดจาก Applicative และเพิ่ม flatMap ซึ่งจัดลำดับการคำนวณที่ ขึ้นต่อกัน แต่ละขั้นสามารถขึ้นต่อผลลัพธ์จากขั้นก่อนหน้าได้

import cats.Monad
import cats.instances.option._

val m = Monad[Option].flatMap(Some(3))(x => Some(x * 10))
println(m) // Some(30)

กฎของ Monad

Monad ต้องปฏิบัติตามกฎสามข้อ:

  • เอกลักษณ์ด้านซ้าย: pure(a).flatMap(f) == f(a)
  • เอกลักษณ์ด้านขวา: m.flatMap(pure) == m
  • การเปลี่ยนหมู่: สามารถจัดกลุ่ม flatMap ที่ซ้อนกันใหม่ได้

Semigroup และ Monoid

Semigroup[A] กำหนด combine ซึ่งมีสมบัติการเปลี่ยนหมู่ ส่วน Monoid[A] จะเพิ่มสมาชิกเอกลักษณ์ empty สิ่งเหล่านี้เป็นพื้นฐานของการพับและการสะสมค่า

import cats.syntax.semigroup._
import cats.instances.int._
import cats.instances.string._

println(3 |+| 4)       // 7
println("foo" |+| "bar") // foobar

Foldable

Foldable[F] ทำให้การพับโครงสร้างเป็นนามธรรม เมื่อใช้ร่วมกับ Monoid แล้ว combineAll จะลดคอลเลกชันให้เหลือค่าเดียว

import cats.Foldable
import cats.instances.list._
import cats.instances.int._

val total = Foldable[List].combineAll(List(1, 2, 3, 4))
println(total) // 10

Traverse

Traverse[F] ช่วยให้คุณแปลงสมาชิกแต่ละตัวเป็นผลกระทบและรวบรวมผลลัพธ์ โดยเปลี่ยน List[F[A]] เป็น F[List[A]]

import cats.syntax.traverse._
import cats.instances.list._
import cats.instances.option._

val r = List(1, 2, 3).traverse(x => Option(x * 2))
println(r) // Some(List(2, 4, 6))

เหตุใดคลาสชนิดจึงสำคัญ

คลาสชนิดช่วยให้คุณเขียนโค้ดที่ทำงานกับชนิด ใดก็ได้ซึ่งมีพฤติกรรมตามที่กำหนด ฟังก์ชันที่มีข้อจำกัดเป็น Monad[F] จะทำงานกับ Option, List, IO และชนิดอื่น ๆ ได้ — เขียนครั้งเดียวแล้วนำกลับมาใช้ได้ทุกที่

import cats.Monad
import cats.syntax.flatMap._
import cats.syntax.functor._

def twice[F[_]: Monad, A](fa: F[A])(f: A => A): F[A] =
  fa.flatMap(a => Monad[F].pure(f(f(a))))

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

คลาสชนิดใดเพิ่ม flatMap สำหรับจัดลำดับการคำนวณที่ขึ้นต่อกัน

สรุปทบทวน

คุณได้สำรวจ ลำดับชั้นคลาสชนิดของ Cats หลัก:

  • Functor — map
  • Applicative — pure และ mapN
  • Monad — flatMap
  • Semigroup/Monoid — combine/empty
  • Foldable/Traverse — พับและรวบรวมผลกระทบ

ถัดไป คุณจะได้พบกับมอนาด IO สำหรับจำลองผลกระทบอย่างบริสุทธิ์

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

บทเรียน “คลาสของชนิดใน Cats” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “คลาสของชนิดใน Cats”

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

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

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

บทเรียน “คลาสของชนิดใน Cats” ใช้เวลานานแค่ไหน

บทเรียน 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