Почему полугруппа скалаза не ковариантна?

Это простой смысл, почему 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

Благодарю.

1 ответ

Как это могло произойти? параметр типа появляется как в ковариантной, так и в контравариантной позиции (результат и аргумент) в основной операции полугруппы, appendтак что оно не может быть ни ковариантным, ни контравариантным

Просто чтобы привести простой контрпример, рассмотрим Seq[Int] (Int это просто исправить тип, может быть что угодно). Вы можете легко определить полугруппу там, с append являющийся ++, Теперь Option не расширяет Seq, но было бы легко организовать опциональный тип, который расширяет Seq (или даже просто тип case class Single[A](a: A) extends Seq[A]). Полугруппа Seq[Int] ни в коем случае не может быть полугруппой Option[Int] или Single[Int], добавление двух вариантов не дает опцию, ни добавление двух синглов.

Другие вопросы по тегам