【问题标题】:Why does Semigroup has an Option type and behave like a neutral element in Monoid?为什么 Semigroup 有 Option 类型并且表现得像 Monoid 中的中性元素?
【发布时间】:2020-09-02 19:23:28
【问题描述】:

为什么 Semigroup 有 Option 类型,而 None 表现得像 Monoid 中的中性元素?

val two: Option[Int] = Option(2)
val n: Option[Int] = None

n |+| two should be(Some(2))//why do we have the opportunity to do this?
two |+| n should be(Some(2))//n look like neutral here

Semigroup[Option[Int]].combine(Option(1), None) should be(Some(1))//why does semigroup has it?

【问题讨论】:

  • 不确定你的问题是什么。
  • monoid 根据定义是具有中性元素的半群,但在这种情况下 - 选项类型,我们看到 None(选项类型投影)确实像 monoid 中的中性元素。但是为什么 semigroup 完全可以应付呢?
  • 根据定义,每个幺半群都是一个半群。一个幺半群支持 Semigroup 的|+| 操作也就不足为奇了。
  • Option 的 Semigroup 是 Option 的 Monoid(因为定义最具体的能力意味着最抽象的能力),所以这应该回答你的问题。 - 此外,无论如何,您希望结果是什么?对于一个有效的 Semigroup 定义,它的combine 必须能够接受相应类型的任意两个任意值并返回另一个也是相应类型一部分的值,因此Option(2) |+| None 必须返回一个有效的选项,它会是哪一个? - 最后,所有其他类型都是如此,要求1 + 0

标签: scala scala-cats monoids semigroup


【解决方案1】:

每个Monoid 也是一个Semigroup。 Semigroup 不必有一个标识元素,但每个 Semigroup 也是一个 Monoid 总是有一个(不“知道”这个概念)。

另一个例子:“整数加法”半群没有正式拥有一个单位元素(零)。它没有定义一个。但是你仍然可以添加 3 + 0 = 3。

【讨论】:

  • “也是一个 Monoid 的半群”,这比我想象的要容易
猜你喜欢
  • 1970-01-01
  • 2017-03-26
  • 1970-01-01
  • 2013-11-09
  • 2017-04-17
  • 1970-01-01
  • 2021-12-25
  • 2018-06-06
  • 1970-01-01
相关资源
最近更新 更多