高阶函数 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
。
假设我们有这个函数定义和调用:
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
。