当使用像Scala和cats-effect
这样的功能环境时,应该使用效果类型来模拟有状态对象的构造吗?
// not a value/case class
class Service(s: name)
def withoutEffect(name: String): Service =
new Service(name)
def withEffect[F: Sync](name: String): F[Service] =
F.delay {
new Service(name)
}
构造不是容易犯错的,因此我们可以使用较弱的类型类,例如Apply
。
// never throws
def withWeakEffect[F: Applicative](name: String): F[Service] =
new Service(name).pure[F]
我想所有这些都是纯属确定性的。只是不是参照透明的,因为每次生成的实例都是不同的。那是使用效果类型的好时机吗?还是这里会有不同的功能模式?
在这种情况下,有状态服务指的是什么?
您是说它在构造对象时会产生副作用吗?为此,一个更好的主意是拥有一种在应用程序启动时运行副作用的方法。而不是在构建过程中运行它。
或者也许您是说它在服务内部拥有可变状态?只要内部可变状态没有暴露,就应该可以。您只需要提供一种与服务进行通信的纯(相对透明)方法即可。