了解 scala 中的 monad
Understanding monads in scala
我试图了解什么是 monad(不仅在 scala 中,而且通过使用 scala 的示例)。让我们考虑最(在我看来)最简单的 monad 示例:
scala.Some
正如某些文章所述,its classic sense 中的每个 monad 都应该为 flatMap
和 unit
函数保留一些规则。
这是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]
。对于 Option
、unit(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))
。或者,可以使用 unit
和 flatMap
和 join
定义 monad 定义为 join(m) = flatMap(id, m)
.
我试图了解什么是 monad(不仅在 scala 中,而且通过使用 scala 的示例)。让我们考虑最(在我看来)最简单的 monad 示例:
scala.Some
正如某些文章所述,its classic sense 中的每个 monad 都应该为 flatMap
和 unit
函数保留一些规则。
这是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]
。对于 Option
、unit(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))
。或者,可以使用 unit
和 flatMap
和 join
定义 monad 定义为 join(m) = flatMap(id, m)
.