我正在尝试将WriterT
应用于我的案子,但遇到了一些问题。我根据需要有以下作家:
val writer: WriterT[Option, List[IO[Unit]], Set[String]] = //
这很好。但是问题是在某些情况下我需要映射作者的价值。特别是我有一个功能
val f: String => Set[String] = //...
我尝试过:
import cats.instances.option._
writer.contramap(f)
但这失败并出现编译错误:
Error:(26, 39) could not find implicit value for parameter F:
cats.Contravariant[Option]
我找到了使用ReaderWriterStateT[Option, Set[String], List[IO[Unit]], Unit, Unit]
的解决方法,以下内容(Kleisli::local
不需要Contravariant
):
val rws: ReaderWriterStateT[Option, Set[String], List[IO[Unit]], Unit, Unit] = //
rws.local(f) //compiles
但是我认为它看起来很奇怪,而且很疯狂。实际上,我只需要WriterT
的语义,而不需要读者。我们可以在这里工作WriterT
吗?