1

Scalaz SemiGroup 不是协变的原因很简单:

https://github.com/scalaz/scalaz/blob/series/7.1.x/core/src/main/scala/scalaz/Semigroup.scala

https://github.com/scalaz/scalaz/blob/series/7.1.x/core/src/main/scala/scalaz/syntax/SemigroupSyntax.scala

谢谢。

4

1 回答 1

1

怎么会这样?类型参数在半群的主运算中同时出现在协变和逆变位置(结果和参数)append,因此它既不能是协变的也不能是逆变的

只是举一个简单的反例,考虑Seq[Int]Int只是为了修复类型,可以是任何东西)。您可以在那里轻松地定义一个半群,使用appendbeing ++。现在 Option 不扩展 Seq,但很容易安排一个类似 option 的类型来扩展 Seq(甚至只是一个 type case class Single[A](a: A) extends Seq[A])。然而,半群Seq[Int]绝不可能是 Option[Int] 或 Single[ Int],附加两个选项不会给出一个选项,也不会附加两个单项。

于 2014-09-21T11:45:05.820 回答