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") // foobarFoldable
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) // 10Traverse
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—mapApplicative—pure和mapNMonad—flatMapSemigroup/Monoid—combine/emptyFoldable/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 反馈 — 无需本地设置。