理解scala中的单子

理解scala中的单子,scala,haskell,monads,Scala,Haskell,Monads,我试图理解什么是单子,不仅仅是在scala中,而是通过使用scala的例子。在我看来,最简单的一个单子例子: scala.Some 正如一些文章所述,中的每个monad都应该为flatMap和unit函数保留一些规则 下面是scala的定义 所以,更好地理解它,我想理解它。我们考虑的是单子,它应该是函子,但在什么之间 这里我们必须对选项[A]和选项[B]进行分类,传递给它的flatMap和f:A=>Option[B]应该在它们之间定义一个函子。但在传统的类别定义中,它是从类别到自身的函子。类别

我试图理解什么是单子,不仅仅是在scala中,而是通过使用scala的例子。在我看来,最简单的一个单子例子:

scala.Some
正如一些文章所述,中的每个monad都应该为flatMap和unit函数保留一些规则

下面是scala的定义

所以,更好地理解它,我想理解它。我们考虑的是单子,它应该是函子,但在什么之间


这里我们必须对选项[A]和选项[B]进行分类,传递给它的flatMap和f:A=>Option[B]应该在它们之间定义一个函子。但在传统的类别定义中,它是从类别到自身的函子。

类别是scala类型的类别,其中对象是类型,箭头是这些类型值之间的函数。选项是此类别上的内函子。对于Scala类别中的每个对象(即类型),Option type构造函数将每个类型A映射到类型选项[A]

此外,它将每个箭头f:A=>B映射到一个箭头fo:Option[A]=>Option[B],Option.map就是这样做的

单子是一个函子M和两个运算,单位为:A=>M[A]和join:M[M[A]=>M[A]。对于选项,unitx:A=Somex和join可以定义为:

def join[A](o: Option[Option[A]]): Option[A] = o match {
  case None => None
  case Some(i) => i
}

然后可以将flatMap定义为,flatMapf,m=joinmapf,m。或者,可以使用unit和flatMap定义monad,并将join定义为joinm=flatMapid,m。

类别是scala类型的类别,其中对象是类型,箭头是这些类型值之间的函数。选项是此类别上的内函子。对于Scala类别中的每个对象(即类型),Option type构造函数将每个类型A映射到类型选项[A]

此外,它将每个箭头f:A=>B映射到一个箭头fo:Option[A]=>Option[B],Option.map就是这样做的

单子是一个函子M和两个运算,单位为:A=>M[A]和join:M[M[A]=>M[A]。对于选项,unitx:A=Somex和join可以定义为:

def join[A](o: Option[Option[A]]): Option[A] = o match {
  case None => None
  case Some(i) => i
}

然后可以将flatMap定义为,flatMapf,m=joinmapf,m。或者,可以使用unit和flatMap定义monad,join定义为joinm=flatMapid,m。

您的问题是什么?monad的概念和flatMap的作用很简单:monad是一个保存值的框,你给flatMap一个函数f,它用框中的值做一些事情,然后你得到另一个框,其中包含将f应用于原始框的值的结果。类别是scala类型的类别,所以Option是该类别上的内函子。@Lee所以它将每个类型T映射到Option[T]?@Lee极好的点。关于类型之间映射的一点澄清。如果我们说T1和T2之间有一个映射,这意味着T1的所有值之间有一个映射,映射成T2类型值的一些可能合适的子集。对吗?你的问题是什么?monad的概念和flatMap的作用很简单:monad是一个保存值的框,你给flatMap一个函数f,它用框中的值做一些事情,然后你得到另一个框,其中包含将f应用于原始框的值的结果。类别是scala类型的类别,所以Option是该类别上的内函子。@Lee所以它将每个类型T映射到Option[T]?@Lee极好的点。关于类型之间映射的一点澄清。如果我们说T1和T2之间有一个映射,这意味着T1的所有值之间有一个映射,映射成T2类型值的一些可能合适的子集。对吗?据我所知,在scala中连接是平坦的。让我再问你一个问题。正如你所说的,我们有两个操作连接和单元。在这个例子中,我们也有两个自然变换。这是相同的还是我们可以根据类别定义证明我们的单子是单子。我不是自己做的,如果这是真的,我也不想要真正的证据。只是想知道它是否是。@user3663882是的,join和unit与mu和eta完全对应。此外,;关联性对应于带有T^3的图,左右标识是IIRC,与另一个标识等效。据我所知,在scala中,连接是平坦的。让我再问你一个问题。正如你所说的,我们有两个操作连接和单元。在这个例子中,我们也有两个自然变换。这是相同的还是我们可以根据类别定义证明我们的单子是单子。我不是自己做的,如果这是真的,我也不想要真正的证据。只是想知道它是否是。@user3663882是的,join和unit与mu和eta完全对应。此外,;关联性对应于带有T^3的图,左标识和右标识IIRC等价于另一个标识。