// 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]
}
1条答案
按热度按时间3htmauhk1#
它们的签名根本不相似,只要看一下就足以确定它们的差异。
zipRight
(更好的名称是andThen
) 的目的是将两个独立的程序组合在一起,其中得到的程序表示运行第一个 (左) 程序,然后运行第二个 (右) 程序,保留后者的结果;而忽略前者的结果。而
flatMap
允许编写两个程序,但第二个程序依赖于第一个程序的结果。这种依赖性是关键点。我们可以在签名中看到:
A => IO[B]
,这意味着我们可以根据结果决定做什么。因此,
zipRight
适用于以下场景:写一个日志消息,然后发送一个通知。
相反,
flatMap
更强大,允许我们做这样的事情:从队列中读取一条消息,如果该值是优先级,则立即处理它,否则将其写入表中。
PS:注意,
zipRight
可以很容易地使用flatMap
实现但相反的是不可能的。