Scala 一元采集、一元类型和一元操作之间有什么区别?

Scala 一元采集、一元类型和一元操作之间有什么区别?,scala,monads,Scala,Monads,我一直在努力理解scala中单子的概念。有不同的术语与单子有关。一元类型类、一元类型、一元操作、一元集合等。 所以我有一些问题,比如一元集合能否支持非一元操作? 有可能揭开scala中与单子相关的不同术语的神秘面纱吗 一元集合能否支持非一元操作 一元集合必须定义两种方法:pure和bind。最重要的是,它必须遵守身份(右和左)和关联性的单子定律 这样的集合是Scala中的List[a],它通过其应用方法具有pure: val l: List[Int] = List(1,2,3) 和flatMa

我一直在努力理解scala中单子的概念。有不同的术语与单子有关。一元类型类、一元类型、一元操作、一元集合等。 所以我有一些问题,比如一元集合能否支持非一元操作? 有可能揭开scala中与单子相关的不同术语的神秘面纱吗

一元集合能否支持非一元操作

一元集合必须定义两种方法:
pure
bind
。最重要的是,它必须遵守身份(右和左)和关联性的单子定律

这样的集合是Scala中的
List[a]
,它通过其应用方法具有
pure

val l: List[Int] = List(1,2,3)
flatMap
bind
):

法律: 左身份: 权利身份: 责任: 正如您所看到的,
List[A]
还支持不属于Monad定义的其他操作,例如
map
(这是由事实
List[A]
免费提供的,每个Monad也是一个Monad,每个Monad也是一个函子)、
过滤器
foldLeft
,等等

回答您的问题:是的,具有一元属性的集合可以支持的不仅仅是由一元定义的操作

更具体地说,我们可以说,
List[A]
是一个实现了
Monad[List]
typeclass的单元集合,这是一个具有单元操作的单元类型

一元集合能否支持非一元操作

一元集合必须定义两种方法:
pure
bind
。最重要的是,它必须遵守身份(右和左)和关联性的单子定律

这样的集合是Scala中的
List[a]
,它通过其应用方法具有
pure

val l: List[Int] = List(1,2,3)
flatMap
bind
):

法律: 左身份: 权利身份: 责任: 正如您所看到的,
List[A]
还支持不属于Monad定义的其他操作,例如
map
(这是由事实
List[A]
免费提供的,每个Monad也是一个Monad,每个Monad也是一个函子)、
过滤器
foldLeft
,等等

回答您的问题:是的,具有一元属性的集合可以支持的不仅仅是由一元定义的操作


更具体地说,我们可以说,
List[A]
是一个实现了
Monad[List]
typeclass的单子集合,而这是一个具有单子操作的单子类型。

数百名研究人员、博主和StackOverflow用户至少在过去十年里“解密”了单子。并不是说没有足够的资料来阅读。这基本上是同一个获得超过1k票的问题:。“有可能揭开单子的不同用法的神秘面纱吗?”这真的不是一个可以用一个单一答案来回答的好问题。对于我在scala中提出的有关monad术语的问题,我在下面得到了一个很好的答案。我更新了问题的细节以获得更多的澄清。数百名研究人员、博客作者和StackOverflow用户至少在过去十年里“揭开”了单子的神秘面纱。并不是说没有足够的资料来阅读。这基本上是同一个获得超过1k票的问题:。“有可能揭开单子的不同用法的神秘面纱吗?”这真的不是一个可以用一个单一答案来回答的好问题。对于我在scala中提出的有关monad术语的问题,我在下面得到了一个很好的答案。为了更清晰,我更新了问题细节
val f: Int => List[Int] = x => List(x + 1)

val x = 1
val left = List(x).flatMap(f)
val right = f(x)

left == right
val y = List(1)
val left = y.flatMap(List(_))
val right = y

left == right
val f: Int => List[Int] = x => List(x + 1)
val g: Int => List[Int] = x => List(x + 2)

val list = List(1,2,3)
val left = list.flatMap(f).flatMap(g)
val right = list.flatMap(x => f(x).flatMap(g))

left == right