Să ne spunem că avem codul (<: Monad[F]
nu lucreze cum era de așteptat):
class External[F[_] <: Monad[F] : Concurrent](implicit proxy: Proxy[F]) { ... }
class Proxy[F[_] <: Monad[F]](implicit storage: Storage, async: Async[F]) {
def get(key: String): F[Option[Entry]] = {
async.blocking(storage.get(key))
}
}
Mi-ar place F[_]
pentru a fi un Monad
, astfel încât proxy.get()
au aceste trăsături și permite, de exemplu (în interiorul External
clasa):
proxy.get(key).flatMap(...)
Până în prezent atât de bine, dar atunci când încearcă pentru a instantia cu cats.effect.IO
nu merge pentru External
:
implicit val proxy: Proxy[IO] = new Proxy()
implicit val external: External[IO] = new External()
Cu ieșire de eroare:
inferred type arguments [[+A]cats.effect.IO[A]] do not conform to value <local External>'s type parameter bounds [F[_] <: cats.Monad[F]]
Cum poate fi fix sau realizat într-un mod diferit?
proxy.get()
nu va aveaMonad
trăsături.