Более идиоматический (монадический?) способ выразить этот Scala

У меня есть несколько блоков кода, которые следуют этому шаблону:

// Dummy function defs.
def result(i : Int, d : Double, b : Boolean) = {
    if (b) d else i
}

def fA(s : String) = {7}
def fB(s : String, i : Int) = {1.0}
def fC(s : String, i : Int, d : Double) = {true}

// Actual code.
def test(s : String) : Double = {
    try {
        val a = fA(s) 
        try {
            val b = fB(s, a)
            try {
                val c = fC(s, a, b)
                result(a, b, c)
            } catch {
                case _ => result(a, b, false)
            }

        } catch {
            case _ => result(a, 0.0, false)
        }
    } catch {
        case _ => result(0, 0.0, false)
    }
}

Где a, b и c вычисляются по очереди соответствующими функциями, а затем значения передаются в функцию результата. Если на каком-либо этапе возникает исключение, то вместо остальных переменных используется значение по умолчанию.

Есть ли более идиоматический способ выразить этот код. Он напоминает мне о монадах тем, что представляет собой серию цепные вычисления, которые немедленно отключаются в случае сбоя любого вычисления.

6
задан jon-hanson 27 June 2012 в 05:33
поделиться