Я работаю в Scala и столкнулся с проблемой с implicit
экземплярами.Давайте рассмотрим следующий пример:
import cats.{Applicative, FlatMap, Monad}
import cats.syntax.functor._
import cats.syntax.flatMap._
import cats.syntax.applicative._
class Test[F[_]: Monad] extends App{
val t1 = ().pure[F]
val t2 = ().pure[F]
def testFlatApplicative: F[Unit] =
for{
_ <- t1
_ <- t2
} yield ()
}
Это прекрасно скомпилируется.Но так как cats.Monad[F[_]]
объявлен следующим образом:
@typeclass trait Monad[F[_]] extends FlatMap[F] with Applicative[F]
Я ожидал, что следующее также будет работать
import cats.{Applicative, FlatMap, Monad}
import cats.syntax.functor._
import cats.syntax.flatMap._
import cats.syntax.applicative._
class Test[F[_]: FlatMap : Applicative] extends App{
val t1 = ().pure[F]
val t2 = ().pure[F]
def testFlatApplicative: F[Unit] =
for{
_ <- t1
_ <- t2
} yield ()
}
Но он не скомпилируется с ошибкой:
Error:(16, 12) value map is not a member of type parameter F[Unit]
_ <- t2
Это странно.Apply
extends Functor
...
Кто-нибудь может объяснить это поведение?