Я проектирую свой алгебраический тип данных и столкнулся с проблемой отключения неявного класса типов.Вот что у меня есть:
sealed abstract class Stream[+F[_], +T] {
def run()(implicit M: Monad[F]): F[Unit] = Stream.run(this)
}
object Stream{
final case object Halt extends Stream[Nothing, Nothing]
private def run[F[_], T](stream: Stream[F, T])(implicit M: Monad[F]): F[Unit] = stream match {
case Halt => M.pure()
}
}
Я получил ошибку компиляции
Error:(10, 22) covariant type F occurs in invariant position in type
Monad[F] of value M def run()(implicit M: Monad[F]): F[Unit] = M.pure()
Я сделал ее ковариантной, чтобы иметь возможность возвращать Halt extends Stream[Nothing, Nothing]
без приведения, но все же мне нужно Monad[F]
класс типов для использования его операции для предоставленного контекста F[_]
.Каким было бы решение в этом случае?