【发布时间】:2019-07-18 20:28:16
【问题描述】:
我正在查看 cats.effect.concurrent.Deferred 并注意到其伴随对象中的所有 pure 工厂方法都返回 F[Deferred[F, A]],而不仅仅是 Deferred[F, A] 之类的 p>
def apply[F[_], A](implicit F: Concurrent[F]): F[Deferred[F, A]] =
F.delay(unsafe[F, A])
但是
/**
* Like `apply` but returns the newly allocated promise directly instead of wrapping it in `F.delay`.
* This method is considered unsafe because it is not referentially transparent -- it allocates
* mutable state.
*/
def unsafe[F[_]: Concurrent, A]: Deferred[F, A]
为什么?
abstract class 定义了两个方法(文档省略):
abstract class Deferred[F[_], A] {
def get: F[A]
def complete(a: A): F[Unit]
}
因此,即使我们直接分配Deferred,也不清楚如何通过其公共方法修改Deferred 的状态。使用F[_] 暂停所有修改。
【问题讨论】:
标签: scala functional-programming referential-transparency cats-effect