0Pricing
Scala for Backend Engineering & Functional Programming · 课时

Cats 类型类

Functor、Monad 等

Cats 类型类 是 CoddyKit 上的免费 Scala for Backend Engineering & Functional Programming 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 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[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 monad 以纯粹的方式表示效应。

常见问题解答

「Cats 类型类」课时是免费的吗?

是的 — 「Cats 类型类」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 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 导师会在你学习这节课的过程中回答你的问题。

学习 Scala for Backend Engineering & Functional Programming 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Scala for Backend Engineering & Functional Programming 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 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