【发布时间】: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