繁体   English   中英

了解Scala中的monad

[英]Understanding monads in scala

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

scala.Some

正如某些文章所指出的那样, 经典意义上的每个monad应该为flatMapunit函数保留一些规则。

这是来自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] 对于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)) 或者,可以使用unitflatMap定义monad,将join定义为join(m) = flatMap(id, m)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM