私はしばらくの間、IOモナドを把握しようとしてきました。私が誤解されていない場合、目標は副作用の説明と実際の実行を分割することです。以下の例のように、Scalaは、参考にトランスパランではない環境変数を取得する方法を持っています。 2つの質問が発生しました。猫効果とIOモナド
質問1:この1参照上transparant
質問2:どのように(単位/プロパティベース)を適切には、これをテスト?メモリ参照をチェックし、内部関数をチェックすることができないので、等価性をチェックすることはできません。なぜなら、誤っていないと関数の比較ができないからです。しかし、私は単体テストで実際の副作用を実行したくありません。また、IOモナドの設計ミスや誤用ですか?
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)
)
}