【发布时间】:2015-02-13 18:41:30
【问题描述】:
是否有一种函数式/Scala 方法可以重复调用一个函数直到它成功,同时对失败的尝试做出反应?
让我用一个例子来说明。假设我想从标准输入中读取一个整数,如果用户实际上没有输入整数,则重试。
给定这个函数:
def read_int(): Either[String, Int] = {
val str = scala.io.StdIn.readLine()
try {
Right(str.trim().toInt)
} catch {
case _: java.lang.NumberFormatException => Left(str)
}
}
还有这个匿名函数:
val ask_for_int = () => {
println("Please enter an Int:")
read_int()
}
val handle_not_int = (s: String) => {
println("That was not an Int! You typed: " + s)
}
我会这样使用它们:
val num = retry_until_right(ask_for_int)(handle_not_int)
println(s"Thanks! You entered: $num")
我的问题是:
- Scala 中是否已经存在
retry_until_right之类的内容? - 能否用现有设施解决? (流、迭代器、Monad 等)
- 是否有任何 FP 库(scalaz?)提供类似的功能?
- 我可以做得更好/更惯用吗? (*)
谢谢!
*) 除了snake_case。我真的喜欢它。
【问题讨论】:
-
我不认为我的问题与那个问题重复。那个是特定于异常失败的,并且重试的数量是有编号的。我的问题更抽象。另一个问题可能是我的一个特殊情况。这个问题也是“实现它的最佳方法是什么?”,我的问题是“我必须实现它吗?” (或者它已经存在?)
标签: scala functional-programming scalaz