我试图了解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 < / em> 他们之间。但是在传统的类别定义中,它是一个从类别到自身的仿函数。
答案 0 :(得分:4)
类别是scala类型的类别,其中对象是类型,箭头是这些类型的值之间的函数。 Option
是此类别的endofunctor。对于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
定义monad,并将join
定义为join(m) = flatMap(id, m)
。