低阶函数编程,它在Scala中是一个很好的风格吗?

时间:2018-03-16 18:52:08

标签: scala functional-programming

我想知道在Scala中应用函数式编程风格是否是一个好习惯,即使它是一个简单的switch case工作流程。

例如:

计划1:

def myMethod1():Unit = {

    ....
}

def myMethod2():Unit = {

    ...
}


def execFunc(myMethod: Unit=>Unit): Unit ={

    myMethod(...)

}

def main((args:Array[String]) {

    if(args(0) == "1")
    {
       execFunc(myMethod1)
    }
    else
    {
       execFunc(myMethod2) 
    }  

}

计划2:

def myMethod1():Unit = {

    ....
}

def myMethod2():Unit = {

    ...
}


def execFunc(methodID:String): Unit ={

    if(methodID == "1")
    {
       myMethod1()
    }
    else
    {
       myMethod2()
    }

}

def main((args:Array[String]) {

   execFunc(args(0))

}

程序1直接传递方法作为参数,程序2是处理切换任务的传统方式。

我想知道,在Scala中,哪种风格更好,为什么?

1 个答案:

答案 0 :(得分:3)

是的,因为函数式语言往往具有作为第一类对象的函数,并且强调传递函数以简化代码,所以可以认为使用更高阶函数更具功能性。

那说,传递函数只是为了传递函数并不是很有用。如果您有合法的用例,请务必!如果您认为它可以帮助您编写更好的代码,请使用您需要的任何工具。请确保您正确使用这些工具。

您的第一段代码的问题是,至少在此示例中,您通过传递method12来获得 nothing 。您只是在不同的范围内调用该功能,单独一点,我看不到任何帮助。

您可以从使用更高阶函数中获得什么?假设您有几个方法,并且所有方法都可能抛出相同的异常,并且它们都需要以相同的一般方式处理它们的异常。你有什么选择?

  • 您可以在每次调用每个方法时写出重复的try块。但是,这可能会变得臃肿,当您需要更改功能时会发生什么?

  • 你可以编写一个包含公共代码的高阶函数,并传递throw函数;在try块中执行它(我的Scala非常生疏):

    def handle(f: () => Int, throwDefault: Int): Int = {
        try {
            return f();
        } catch {
            case e: SomeException => {
                logOrWhatever(e);
                return throwDefault;
            }
        }
    }  
    
    println(handle(method1, 5))
    println(handle(method2, 10))