gpt4 book ai didi

scala - 使 F[_] 在接受 IO 时实现 Monad 特性

转载 作者:行者123 更新时间:2023-12-02 16:04:55 25 4
gpt4 key购买 nike

假设我们有代码(<: 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]]

如何解决这个问题或以不同的方式实现?

最佳答案

替换

class External[F[_] <: Monad[F] : Concurrent]

class External[F[_]: Monad : Concurrent]

成为 Monad 并不意味着成为 Monad 的子类型。这意味着当前类型有一个类型类 Monad 的实例。

与 OOP 相反,在 FP 中实现一些抽象行为不是通过扩展/继承/子类型多态性,而是通过隐式/定义类型类实例/ad hoc 多态性来实现。

也许您需要导入必要的语法:

import cats.syntax.flatMap._

import cats.syntax.functor._

或一次所有语法

import cats.syntax.all._

How to enforce F[_] to be an instance of Monad

https://eed3si9n.com/herding-cats/import-guide.html

关于scala - 使 F[_] 在接受 IO 时实现 Monad 特性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69695162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com