了解 scala 中的 monad

Understanding monads in scala

我试图了解什么是 monad(不仅在 scala 中,而且通过使用 scala 的示例)。让我们考虑最(在我看来)最简单的 monad 示例:

scala.Some

正如某些文章所述,its classic sense 中的每个 monad 都应该为 flatMapunit 函数保留一些规则。

这是scala.Some

的定义
@inline final def flatMap[B](f: A => Option[B]): Option[B]

所以,更好地了解它我想了解它from the category theory standpoint。所以,我们正在考虑一个 monad,它应该是一个仿函数(但是在什么之间?)。

这里我们必须对 Option[A]Option[B] 进行分类,flatMap 连同传递给它的 f: A => Option[B] 应该定义一个 Functor之间。但在传统类别定义中,它是从类别到自身的函子。

类别是 scala 类型的类别,其中对象是类型,箭头是这些类型的值之间的函数。 Option 是此类别的内函子。对于 Scala 类别中的每个对象(即类型),Option 类型构造函数将每个类型 A 映射到类型 Option[A].

此外,它将每个箭头 f: A => B 映射到箭头 fo: Option[A] => Option[B],这就是 Option.map 所做的。

一个 Monad 是一个 Functor M 以及两个操作 unit: A => M[A]join: M[M[A]] => M[A]。对于 Optionunit(x: A) = Some(x)join 可以定义为:

def join[A](o: Option[Option[A]]): Option[A] = o match {
  case None => None
  case Some(i) => i
}

flatMap 可以定义为 flatMap(f, m) = join(map(f, m))。或者,可以使用 unitflatMapjoin 定义 monad 定义为 join(m) = flatMap(id, m).