【发布时间】:2017-11-18 01:50:22
【问题描述】:
我一直在尝试掌握 IO monad,这很有意义。如果我没记错的话,目标是将副作用的描述和实际执行分开。如下例所示,Scala 有一种方法可以获取不透明的环境变量。出现了两个问题。
问题 1:这个是否具有引用透明性
问题 2:如何正确(基于单元/属性)测试这个?无法检查是否相等,因为它将检查内存引用并且无法检查内部函数,因为如果我没记错的话,函数比较是不可能的。但是,我不想在我的单元测试中运行实际的副作用。另外,这是设计错误还是 IO monad 的误用?
case class EnvironmentVariableNotFoundException(message: String) extends Exception(message)
object Env {
def get(envKey: String): IO[Try[String]] = IO.unit.flatMap((_) => IO.pure(tryGetEnv(envKey)))
private[this] def tryGetEnv(envKey: String): Try[String] =
Try(System.getenv(envKey))
.flatMap(
(x) =>
if (x == null) Failure(EnvironmentVariableNotFoundException(s"$envKey environment variable does not exist"))
else Success(x)
)
}
【问题讨论】:
标签: scala functional-programming monads scala-cats