Здесь есть пара проблем, и первая из них самая запутанная. writeAll
является полиморфным c в своем контексте F[_]
, но для него требуется экземпляр ContextShift
для F
(а также Sync
). В настоящее время у вас нет ContextShift[IO]
в области видимости, поэтому компилятор не сделает вывод, что F
для writeAll
должно быть IO
. Если вы добавите что-то вроде этого:
implicit val ioContextShift: ContextShift[IO] =
IO.contextShift(scala.concurrent.ExecutionContext.Implicits.global)
… тогда компилятор выведет IO
, как и следовало ожидать.
В таких случаях я предлагаю пропустить вывод типа. Запись с параметром типа лишь немного более подробна:
.through(
io.file
.writeAll[IO](Paths.get("file.txt"), blocker)
)
… и это означает, что вы получите полезные сообщения об ошибках для таких вещей, как отсутствующие экземпляры классов типов.
Как только вы исправил эту проблему, есть несколько других. Следующее, что использование evalMap
в этом контексте означает, что у вас будет поток из ()
значений. Если вы измените его на evalTap
, побочные эффекты регистрации по-прежнему будут происходить соответствующим образом, но вы не потеряете фактические значения потока, в котором его вызываете.
Последняя проблема заключается в том, что writeAll
требует поток байтов, в то время как вы дали ему поток Int
с. Как вы хотите справиться с этим несоответствием, зависит от предполагаемой семантики, но для примера что-то вроде .map(_.toByte)
заставит его скомпилировать.