この答えは、コメントについて、より詳細に行く:
flapmap使用する方法があった場合、私は不思議でしたか?あなたのソリューションは私のために働き、他の選択肢を知りたいだけです。
あなたはおそらく聞いてきたように、Option
とTry
はモナドのインスタンスであり、モナドは計算の順序を表すには便利ですが、彼らは他のモナドで構成されていません。つまり、Option
とTry
を作成することはできません。我々は共通の地面を見つける必要があります。
Option
とTry
のセマンティクスの違いは、結果が存在しない場合の情報を含むTry
です。
Try#toOption
を使用して、からOption
に行くことができます。
逆の場合、この情報を追加する必要があります。Option
に値が存在しない場合に失敗の理由を提供する必要があります。
が
val res: Try[Int] = for {
strValue <- optionToTry(m.get("a"), new NoSuchElementException("a"))
value <- Try(strValue.trim.toInt)
} yield value
次のように2つのTry
のインスタンスを作成するために舞台裏でflatMap
を使用する:このような何か:として
import scala.util.{Try, Success, Failure}
def optionToTry[T](opt:Option[T], failure: => Throwable): Try[T] = opt match {
case Some(v) => Success(v)
case None => Failure(failure)
}
その機能の助けを借りて、我々は元の式を書き換えることができます
val res = optionToTry(m.get("a"), new NoSuchElementException("a"))
.flatMap(strValue => Try(strValue.trim.toInt))
安全でないマップゲッターを使用してコードを少しずつ保存できることに注意してください。
val res: Try[Int] = for {
strValue <- Try(m("a"))
value <- Try(strValue.trim.toInt)
} yield value
しかし、このバージョンは、JVMで例外を処理するコストを考えると、計算コストが高くなります。
コメント:「flapmapを使用する方法があれば」潜在的な失敗の理由を保存したいのですか(試してください)、結果に興味がありますか(オプション)?? – maasg
「m」以外のものを手に入れようとすると、どんな結果が欲しいですか? 「m.get( "c")」と言ってください。 –