#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
, и все будет в порядке.