[英]Understanding monads in scala
我试图了解什么是monad(不仅在scala中,而且通过使用scala为例)。 让我们考虑一个单子最简单的例子:
scala.Some
正如某些文章所指出的那样, 经典意义上的每个monad应该为flatMap
和unit
函数保留一些规则。
这是来自scala.Some
的定义。
@inline final def flatMap[B](f: A => Option[B]): Option[B]
因此,要更好地理解它,我想从范畴论的角度来理解它。 因此,我们正在考虑一个monad,它应该是一个函子( 但介于什么之间? )。
在这里,我们必须对Option[A]
和Option[B]
以及flatMap
以及f: A => Option[B]
传入其中的f: A => Option[B]
应该在它们之间定义一个Functor 。 但是在传统类别定义中,它是从类别到其本身的函子。
类别是scala类型的类别,其中对象是类型,箭头是这些类型的值之间的函数。 Option
是此类的endofunctor。 对于Scala类别中的每个对象(即类型), Option
类型构造函数都将每个类型A
映射到类型Option[A]
。
另外,它将每个箭头f: A => B
映射到箭头fo: Option[A] => Option[B]
,这是Option.map
作用。
Monad是函子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)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.