Согласованность типов классов является общеизвестной проблемой.
Например, Monad
должно быть Functor
, а Traversable
также должно быть Functor
.Если has to be
представлено через наследование (Monad[F[_]] extends Functor[F[_]]
), то, скорее всего, будет неясность в неявном разрешении.
Я применил эмпирическое правило: если у вас есть проблема с наследованием, замените его делегированием.Вот пример:
trait Semigroup[A] {
def append(a: A, b: A): A
}
trait Monoid[A] {
def zero(): A
val semigroup: Semigroup[A]
def append(a: A, b: A): A = semigroup.append(a, b)
}
implicit object IntSemigroup extends Semigroup[Int] {
override def append(a: Int, b: Int): Int = a + b
}
implicit object IntMonoid extends Monoid[Int] {
override def zero(): Int = 0
override val semigroup: Semigroup[Int] = IntSemigroup
}
def main(args: Array[String]): Unit = {
println(implicitly[Monoid[Int]].append(2, 3))
}
Я полагаю, что этот подход не работает, поскольку он очевиден, но не используется в scalaz / cats.Не могли бы вы указать мне на проблемы?