将一个方法“提升”到“函数”有什么好处?

时间:2018-02-21 11:47:10

标签: scala

我读到了#34;提升"可用于将方法调用提升到函数中。这个例子是

scala> def times2(i: Int) = i * 2
times2: (i: Int)Int

我们通过应用下划线将方法提升为函数

scala> val f = times2 _
f: Int => Int = <function1>

scala> f(4)
res0: Int = 8

这有什么好处?我可以使用f(4)或times2(4)

2 个答案:

答案 0 :(得分:5)

如果要将方法作为参数传递给更高阶函数,则必须解除。例如,如果您有f: Int => Int和更高阶函数

def higherOrderFunction(f: Int => Int): Int = f(42)

您可以将f传递给它。您无法使用方法执行此操作,因为方法不是值。但是,该方法可以解除到函数值:

def higherOrderFunction(f: Int => Int): Int = f(42)
def times2(i: Int) = i * 2
val f = times2 _
println(higherOrderFunction(f)) // prints 84

现在,这可能看起来不是什么大问题,因为在将times2传递给f时,您可以直接编写higherOrderFunction而不是f,因为scala会将其变成看起来很像的东西非常像(times2 _)

以下是语法 val times4: Int => Int = (times2 _) andThen (times2 _) println(times4(100)) 实际有用的示例:

400

这会打印f

关键是This is my text. <i class="far fa-question-circle" data-toggle="tooltip" data-title="This is my tooltip."></i> 是一等公民价值:您可以将其存储在某种数据结构中,或通过网络发送。这是函数式编程的全部要点:您可以将函数和闭包传递给更高阶的函数。

答案 1 :(得分:1)

Scala是一种面向对象的语言。您只能 使用对象执行操作。您只能将对象存储在变量中。您只能将对象作为参数传递。您只能返回对象。

方法不是对象。

不是对象的东西是面向对象语言中的非常大的限制。您不能将方法存储在变量中。您不能将方法作为参数传递。你不能返回一个方法。你不能在方法上调用方法。

因此,将一个方法(不是一个对象)提升到一个函数( 一个对象)的可能性是一个大问题,因为它删除了所有的限制,并允许你所有你可以用任何其他物体做的事情。