Можно ли упорядочить файл cats.effect.IO, т. Е. Находится ли он в классе типов Traverse? - PullRequest
0 голосов
/ 24 мая 2018

Мне нравится упорядочивать наборы эффектов, например, чтобы превратить List[IO[Int]] в IO[List[Int]], например, так: -

scala> import cats._, cats.data._, cats.implicits._, cats.effect._

scala> val efs : List[IO[Int]] = List(IO(1),IO(2))
efs: List[cats.effect.IO[Int]] = List(IO$647684131, IO$2021068036)

scala> var efOfInts = efs.sequence
efOfInts: cats.effect.IO[List[Int]] = <function1>

scala> efOfInts.unsafeRunSync
res2: List[Int] = List(1, 2)

Но возможно ли пойти другим путем?например, чтобы превратить IO[List[Int]] в List[IO[Int]]?

Кажется, я не могу найти следствия для добавления sequence в IO, так что теперь я задаюсь вопросом, нельзя ли выполнить Traverse или Sequence IO?

Кто-нибудь сделал это или знает, почемуэто не разрешено?

Спасибо.

1 Ответ

0 голосов
/ 24 мая 2018

Нет, это не разрешено.

Вся идея IO состоит в том, что вы не можете получить значения из нее без unsafeRunSync.Нет «заглядывания внутрь»

Так как Traversable также означает Foldable, давайте посмотрим, почему что-то вроде foldLeft на IO нарушает правило заглядывания внутрь.

def foldLeft[A, B](fa: IO[A], b: B)(f: (B, A) => B): B

Так, например, если мыимел x: IO[Int] (который производит 2)

foldLeft (x, 0) (_ + _), который должен был бы вернуть нам 2.Итак, мы заглянули внутрь.foldLeft должен был бы unsafeRunSync, что нарушает ссылочную прозрачность.

Так что по этой (и другим подобным) причинам вы не можете иметь Traverse на IO.

...