假設我們有代碼(<: Monad[F]沒有按預期作業):
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))
}
}
我想F[_]成為一個Monad,以便proxy.get()具有這些特征并啟用例如(在External課堂內):
proxy.get(key).flatMap(...)
到目前為止cats.effect.IO一切順利,但是當嘗試使用它進行實體化時,它不適用于External:
implicit val proxy: Proxy[IO] = new Proxy()
implicit val external: External[IO] = new External()
有錯誤輸出:
inferred type arguments [[ A]cats.effect.IO[A]] do not conform to value <local External>'s type parameter bounds [F[_] <: cats.Monad[F]]
如何以不同的方式修復或實作這一點?
uj5u.com熱心網友回復:
代替
class External[F[_] <: Monad[F] : Concurrent]
和
class External[F[_]: Monad : Concurrent]
成為 aMonad并不意味著成為 的子型別Monad。這意味著Monad當前型別有一個型別類的實體。
與 OOP 相反,在 FP 中實作一些抽象行為不是通過擴展/繼承/子型別多型而是通過隱式/定義型別類實體/臨時多型來實作的。
也許您需要匯入必要的語法:
import cats.syntax.flatMap._
或者
import cats.syntax.functor._
或所有的synaxes
import cats.syntax.all._
如何強制 F[_] 成為 Monad 的一個實體
https://eed3si9n.com/herding-cats/import-guide.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/336040.html
