高阶函数 scala

Higher order functions scala

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

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

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

使用 Intellij,我看到函数内部的 变量 "n" 是 String 类型。

为什么之前未声明的变量被 Scala 推断为字符串?

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

你能给我解释一下吗?

n 在您的示例中不是变量。这是一个论点(轻微的语义差异)。 n => x 符号表示接受 n 和 returning x 的函数。

由于您将 sayHello 的 return 值定义为一个函数 String => String,您唯一可以在此处 return是一个接受 String 和 returning String 的函数。这就是为什么您可以跳过 n 的参数类型。根据 sayHello 的当前定义,很明显,n 只能是 String.

如果您没有定义 sayHello 的 return 类型,scala 会要求您提供 n 参数的类型,因为它不可能推断出它来自函数定义:

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

在上面的示例中,sayHello 的 return 值从其主体推断为 String => String