为什么scalaz半群不是协变的?

为什么scalaz半群不是协变的?,scala,scalaz,scalaz7,semigroup,Scala,Scalaz,Scalaz7,Semigroup,Scalaz半群不协变的原因很简单: 谢谢。怎么可能?类型参数在半群的主运算中同时出现在协变和逆变位置(结果和参数),append,因此它既不能是协变的,也不能是逆变的 只要给出一个简单的反例,考虑 SEQ[INT] < /代码>( int >代码>只是修复类型,可以是任何东西)。您可以很容易地在那里定义一个半群,append是++。 现在Option并没有扩展Seq,但很容易安排一个类似Option的类型来扩展Seq(甚至只是一个类型case class Single[a](a:a)扩展S

Scalaz半群不协变的原因很简单:


谢谢。

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

只要给出一个简单的反例,考虑<代码> SEQ[INT] < /代码>(<代码> int >代码>只是修复类型,可以是任何东西)。您可以很容易地在那里定义一个半群,

append
++
。 现在Option并没有扩展Seq,但很容易安排一个类似Option的类型来扩展Seq(甚至只是一个类型
case class Single[a](a:a)扩展Seq[a]
)。然而
Seq[Int]
的半群决不能是Option[Int]或Single[Int]的半群,附加两个选项不会给出选项,也没有附加两个单打