了解scala中的monad

时间:2016-07-07 12:39:07

标签: scala haskell monads

我试图了解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 < / em> 他们之间。但是在传统的类别定义中,它是一个从类别到自身的仿函数。

1 个答案:

答案 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]。对于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)