在ZIO中,flatMap和zipRight有什么区别?

Gre*_*reg 0 scala zio

看看他们的签名,这些看起来非常相似。ZIO 中这两个函数之间的语义差异是什么\xe2\x80\x99?

\n

Lui*_*rez 8

他们的签名一点也不相似,只要看一眼就足以确定他们的区别。

// I am going to omit all the extra noise of ZIO.
// Since this is just a general question of the "Program as Values" paradigm,
// which is the underlying paradigm behind these libraries.
trait IO[+A] {
  def zipRight[B](iob: IO[B]): IO[B]
  def flatMap[B](f: A => IO[B]): IO[B]
}
Run Code Online (Sandbox Code Playgroud)

zipRight (更好地称为andThen的目的是将两个独立的程序组合在一起,其中生成的程序表示运行第一个(左)程序,然后运行第二个(右)程序,并保留后者的结果;而忽略前者的结果。

然而,flatMap允许编写两个程序,但第二个程序取决于第一个程序的结果。这种依赖性是关键点。
我们可以在签名中看到:A => IO[B],这意味着我们可以根据结果决定做什么。

因此,zipRight适用于以下场景:

写入日志消息,然后发送通知。

相反,flatMap变得更强大可以让我们做类似的事情:

从队列中读取消息,如果该值是优先级,则立即处理它,否则将其写入表中。


PS:请注意,zipRight可以使用轻松实现flatMap

def zipRight[B](iob: IO[B]): IO[B] =
  this.flatMap(_ => iob) // Note how we ignore the result of evaluating this.
Run Code Online (Sandbox Code Playgroud)

但相反的情况是不可能的。