gpt4 book ai didi

scala - 为什么 future 会有副作用?

转载 作者:行者123 更新时间:2023-12-04 02:35:44 24 4
gpt4 key购买 nike

我在看书FPiS在第 107 页上,作者说:

We should note that Future doesn’t have a purely functional interface. This is part of the reason why we don’t want users of our library to deal with Future directly. But importantly, even though methods on Future rely on side effects, our entire Par API remains pure. It’s only after the user calls run and the implementation receives an ExecutorService that we expose the Future machinery. Our users therefore program to a pure interface whose implementation nevertheless relies on effects at the end of the day. But since our API remains pure, these effects aren’t side effects.



为什么 Future 没有纯粹的功能接口(interface)?

最佳答案

问题在于,由于 Future 的急切本性,创建一个会引起副作用的 Future 本身也是一种副作用。

这破坏了引用透明度。 IE。如果您创建一个仅打印到控制台的 Future,则 Future 将立即运行并运行副作用,而无需您要求它。

一个例子:

for {
x <- Future { println("Foo") }
y <- Future { println("Foo") }
} yield ()

这导致“Foo”被打印两次。现在如果 Future是参照透明的,我们应该能够在下面的非内联版本中获得相同的结果:
val printFuture = Future { println("Foo") }

for {
x <- printFuture
y <- printFuture
} yield ()

但是,这只会打印一次“Foo”,甚至更成问题,无论您是否包含 for-expression,它都会打印它。或不。

使用引用透明的表达式,我们应该能够在不改变程序语义的情况下内联任何表达式,Future 不能保证这一点,因此它破坏了引用透明性并且本质上是有效的。

关于scala - 为什么 future 会有副作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44196088/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com