如何不显式指定Cats类型类调用foreverM方法?
让
IO.foreverM代码编译通过的方法 问题原因
foreverM是cats.FlatMap类型类中的方法,IO本身并没有直接定义这个成员方法,所以直接写IO.foreverM会因为找不到该方法而编译失败。而FlatMap[IO].foreverM是直接调用FlatMap类型类实例的方法,因此可以正常编译。
解决方案
通过**扩展方法(Extension Method)**将FlatMap的foreverM方法扩展到IO类型上,这样就能直接用IO.foreverM的写法:
import cats.effect.IO import cats.FlatMap import scala.concurrent.duration._ // 给所有实现了FlatMap的F类型添加foreverM扩展方法 extension [F[_]: FlatMap, A](fa: F[A]) def foreverM: F[Nothing] = FlatMap[F].foreverM(fa) // 现在这段代码可以正常编译运行 IO.foreverM: IO.sleep(1.seconds) *> IO.println("Tick")
补充说明
如果你的项目中已经导入了cats.syntax.all._(Cats语法糖全集),其实已经包含了类似的扩展,不过如果没有的话,上面的自定义扩展可以直接解决问题。这种扩展方式是Scala 3中添加类型类方法语法糖的标准做法,能让类型类方法的调用更直观。
内容的提问来源于stack exchange,提问作者Max Smirnov
相关产品推荐
相关产品推荐

