Я пытаюсь применить 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
работать здесь?