import scala.util.Try // Some だったら継続に値を渡して実行。None だったら継続を破棄して ifNone の結果を返す def someValueOr[R, A](fa: Option[A])(ifNone: => R): Cont[R, A] = Cont(ar => fa.fold(ifNone)(ar)) // Cont(fa.fold(ifNone)) // Success だったら継続に値を渡して実行。None だったら継続を破棄して ifFailure の結果を返す def successValueOr[R, A](fa: Try[A])(ifFailure: Throwable => R): Cont[R, A] = Cont(ar => fa.fold(ifFailure, ar)) // Cont(fa.fold(ifFailure, _)) // input から指定された key に対応する値を取り出し、数値型に変換する def parseInt(input: Map[String, String], key: String): Cont[String, Int] = for { s <- someValueOr(input.get(key))(s"not found: $key") i <- successValueOr(Try(s.toInt))(_.toString) } yield i // === // 例えば下記のような input を仮定する val input = Map("name" -> "aoiroaoino", "age" -> "17") parseInt(input, "address").run(i => s"result: $i") parseInt(input, "name").run(i => s"result: $i") parseInt(input, "age").run(i => s"result: $i") // === scala> parseInt(input, "address").run(i => s"result: $i") res99: String = not found: address scala> parseInt(input, "name").run(i => s"result: $i") res100: String = java.lang.NumberFormatException: For input string: "aoiroaoino" scala> parseInt(input, "age").run(i => s"result: $i") res101: String = result: 17