我一直在嘗試掌握IO monad一段時間,它是有道理的。如果我沒有弄錯,我們的目標是將副作用和實際執行的描述分開。正如在下面的例子中,Scala有一種方法來獲得一個不引人注意的環境變量。出現了兩個問題。貓效應和IO monad
問題1:這是一個指涉TRANSPARANT
問題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)
)
}