Scalaz SemiGroup 不是协变的原因很简单:
https://github.com/scalaz/scalaz/blob/series/7.1.x/core/src/main/scala/scalaz/Semigroup.scala
谢谢。
怎么会这样?类型参数在半群的主运算中同时出现在协变和逆变位置(结果和参数)append
,因此它既不能是协变的也不能是逆变的
只是举一个简单的反例,考虑Seq[Int]
(Int
只是为了修复类型,可以是任何东西)。您可以在那里轻松地定义一个半群,使用append
being ++
。现在 Option 不扩展 Seq,但很容易安排一个类似 option 的类型来扩展 Seq(甚至只是一个 type case class Single[A](a: A) extends Seq[A]
)。然而,半群Seq[Int]
绝不可能是 Option[Int] 或 Single[ Int],附加两个选项不会给出一个选项,也不会附加两个单项。