看看他们的签名,这些看起来非常相似。ZIO 中这两个函数之间的语义差异是什么\xe2\x80\x99?
\n他们的签名一点也不相似,只要看一眼就足以确定他们的区别。
// 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)
但相反的情况是不可能的。
| 归档时间: |
|
| 查看次数: |
165 次 |
| 最近记录: |