Значение с фильтром не является членом Cats IO для понимания

#scala #scala-cats

#scala #scala-cats

Вопрос:

Я написал этот код, и он отлично компилируется

 for {
  list : List[Int] <- Future(List(1, 2, 3))
} yield list.size 

res7: Future[Int] = Future(Success(3))
 

Но если я преобразую этот код в

 for {
  list : List[Int] <- IO(List(1, 2, 3))
} yield list.size
 

Я получаю ошибку во время компиляции

 value withFilter is not a member of cats.effect.IO[List[Int]]
 

Если я удаляю тип, он компилируется нормально

 for {
  list  <- IO(List(1, 2, 3)) // returns IO[List[Int]]
} yield list.size 
res8: IO[Int] = Map(Delay(<function0>), <function1>, 0)
 

Почему я не могу указать тип с помощью ввода-вывода?

У меня включена частичная унификация, поэтому этого не может быть 🙂

Комментарии:

1. Как ясно указано в ошибке, у ввода -вывода нет withFilter метода. (Вы можете проверить scaladoc здесь ) . Когда вы явно указываете тип, вы в основном фильтруете все элементы, соответствующие такому типу. И, поскольку метод не существует, он не будет компилироваться. — И нет, я не знаю никакого обходного пути.

2. Так это недостаток ввода-вывода? или есть причина, по которой withFilter намеренно был пропущен?

3.Я не знаю, я просто пользователь ввода-вывода, а не сопровождающий 🙂 — Но я могу подумать, по крайней мере, о том, почему у него этого не должно быть. IO — это не совсем «контейнер» элементов, например List, поскольку это всего лишь описание вычисления, и если вы хотите видеть его как контейнер, в нем будет только один элемент, например, Option . Но, в отличие от первого, не существует понятия пустого ввода-вывода. Таким образом, фильтрация ввода-вывода не имеет смысла.

4. Вы можете найти это полезным: github.com/oleg-py /…

5. Обходными путями было бы ввести еще одну переменную for { list <- IO(List(1, 2, 3)); list1: List[Int] = list } yield list1.size или отключить для понимания IO(List(1, 2, 3)).map((list: List[Int]) => list.size)

Ответ №1:

Ваш for-comprehension будет изменен на form, который использует function withFilter и, поскольку IO у него нет этого метода, компиляция завершается с ошибкой.

К счастью, есть плагин компилятора better-monadic-for, который решает эту проблему.

Просто добавьте addCompilerPlugin("com.olegpy" %% "better-monadic-for" % "0.3.0") свой build.sbt , и все будет в порядке.