Scala的列表在串联运算符下是否构成一个monoid?

时间:2018-11-10 15:34:33

标签: scala functional-programming scala-cats monoids

首先,对不起,但我不是英语母语人士。但是,我会尽力而为。

我实际上是在学习一些理论概念,作为加深对函数式编程的理解的业余爱好,并有一些问题可用来检查我是否正确理解了类人动物。

首先,我发现的一个monoid的定义是,一个monoid是一个在关联二进制运算下关闭且具有标识元素的集合。我想这是正确的吗?

因此,使用以下定义,我假设Scala的列表在:::运算符下形成一个monoid,因为List是一个集合,:::是关联的(xs ::: (ys ::: zs) = (xs ::: ys) ::: zs)并且List有一个基本元素(Nil)。我说的对吗?

关于Monoid,关于:: List运算符有什么要说的吗?我想不是因为它不是以两个列表作为参数,而是一个元素和一个List。我还对吗?

1 个答案:

答案 0 :(得分:4)

  

首先,我发现的一个monoid的定义是,一个monoid是一个在关联二进制运算下关闭且具有标识元素的集合。我想这是正确的吗?

据我所知,这是正确的。 (免责声明:我还在学习)

  

因此,使用以下定义,我假设Scala的列表在:::运算符下形成一个monoid,因为List是一个集合,:::是关联的(xs :::(ys ::: zs)=( xs ::: ys)::: zs),而List具有基本元素(Nil)。我说的对吗?

也正确。
例如,这里是Monoid[List[A]]Cats的定义-这里是Monoid[List[A]]Scalaz的规范。
两者都是用于在Scala中进行功能编程的库/框架,并且您可以看到它们都使用:::Nil定义了列表的Monoid。

  

关于Monoid,关于:: List运算符有什么要说的吗?我想不是因为它不是以两个列表作为参数,而是一个元素和一个List。我还对吗?

据我所知,您仍然是正确的。