高阶函数scala

时间:2018-05-30 09:41:19

标签: scala function functional-programming

假设我们有这个函数定义和调用:

def sayHello(prefix:String):(String => String) = {
  n => s"$prefix $n"
}

val greeting = sayHello("Hello")
greeting("Gio")

使用Intellij,我看到变量" n" inside函数的类型为String

为什么以前未声明的变量被Scala推断为String?

我理解高阶函数会返回一个函数String => String,但我看不出这两个概念之间的关系。

你可以向我澄清一下吗?

1 个答案:

答案 0 :(得分:3)

您示例中的

n不是变量。这是一个论点(轻微的语义差异)。 n => x表示法表示接受n并返回x的函数。

由于您将sayHello的返回值定义为函数String => String,这里唯一可以返回的是一个String并返回String的函数。这就是为什么你可以跳过n的参数类型。根据{{​​1}}的当前定义,sayHello只能是n

如果你没有定义String的返回类型,scala会要求你给出sayHello参数的类型,因为它不可能从函数definiton推断出它: / p>

n

在上面的示例中,def sayHello(prefix:String) = { n: String => s"$prefix $n" } 的返回值从其正文推断为sayHello