Scala 函数部分应用
Scala function partial application
我正在尝试了解函数 部分应用程序 在 Scala 中的工作原理。
为此,我构建了这个简单的代码:
object Test extends App {
myCustomConcat("General", "Public", "License") foreach print
GeneralPublicLicenceAcronym(myCustomConcat(_)) foreach print
def myCustomConcat(strings: String*): List[Char] = {
val result = for (s <- strings) yield {
s.charAt(0)
}
result.toList
}
def GeneralPublicLicenceAcronym (concatFunction: (String*) => List[Char] ) = {
myCustomConcat("General", "Public", "License")
}
}
myCostumConcat 函数输入一个字符串数组,returns 一个包含每个字符串首字母的列表.
所以,代码
myCustomConcat("General", "Public", "License") foreach print
将在控制台上打印:GPL
现在假设我想编写一个函数来生成 GPL 首字母缩略词,使用(作为输入参数)我以前的函数提取每个字符串的第一个字母:
def GeneralPublicLicenceAcronym (concatFunction: (String*) => List[Char] ): List[Char] = {
myCustomConcat("General", "Public", "License")
}
运行 部分应用的新函数:
GeneralPublicLicenceAcronym(myCustomConcat(_)) foreach print
我收到这个错误:
错误:(8, 46) 类型不匹配;发现:Seq[String] 需要:String GeneralPublicLicenceAcronym(myCustomConcat(_)) foreach print
为什么?在这种情况下我可以使用部分应用程序吗?
您需要做的就是将 myCustomConcat(_)
更改为 myCustomConcat _
,或者实际上只是 myCustomConcat
您所做的并不完全是部分应用 - 它只是使用 方法 作为函数值。
在某些情况下(期望函数值)编译器会计算出您的意思,但在其他情况下您通常需要使用 _
后缀告诉编译器您的意图。
"partial application" 表示我们提供了一些但不是全部的参数给函数,以创建一个新函数,例如:
def add(x: Int, y: Int) = x + y //> add: (x: Int, y: Int)Int
val addOne: Int => Int = add(1, _) //> addOne : Int => Int = <function1>
addOne(2) //> res0: Int = 3
我想你的情况可以被视为部分应用,但应用 none 的参数 - 你 可以 使用部分应用语法在这里,但你需要给编译器一个_*
提示,因为重复的参数(String*
),结果有点难看:
myCustomConcat(_:_*)
另请参阅:Scala type ascription for varargs using _* cause error
我正在尝试了解函数 部分应用程序 在 Scala 中的工作原理。
为此,我构建了这个简单的代码:
object Test extends App {
myCustomConcat("General", "Public", "License") foreach print
GeneralPublicLicenceAcronym(myCustomConcat(_)) foreach print
def myCustomConcat(strings: String*): List[Char] = {
val result = for (s <- strings) yield {
s.charAt(0)
}
result.toList
}
def GeneralPublicLicenceAcronym (concatFunction: (String*) => List[Char] ) = {
myCustomConcat("General", "Public", "License")
}
}
myCostumConcat 函数输入一个字符串数组,returns 一个包含每个字符串首字母的列表.
所以,代码
myCustomConcat("General", "Public", "License") foreach print
将在控制台上打印:GPL
现在假设我想编写一个函数来生成 GPL 首字母缩略词,使用(作为输入参数)我以前的函数提取每个字符串的第一个字母:
def GeneralPublicLicenceAcronym (concatFunction: (String*) => List[Char] ): List[Char] = {
myCustomConcat("General", "Public", "License")
}
运行 部分应用的新函数:
GeneralPublicLicenceAcronym(myCustomConcat(_)) foreach print
我收到这个错误:
错误:(8, 46) 类型不匹配;发现:Seq[String] 需要:String GeneralPublicLicenceAcronym(myCustomConcat(_)) foreach print
为什么?在这种情况下我可以使用部分应用程序吗?
您需要做的就是将 myCustomConcat(_)
更改为 myCustomConcat _
,或者实际上只是 myCustomConcat
您所做的并不完全是部分应用 - 它只是使用 方法 作为函数值。
在某些情况下(期望函数值)编译器会计算出您的意思,但在其他情况下您通常需要使用 _
后缀告诉编译器您的意图。
"partial application" 表示我们提供了一些但不是全部的参数给函数,以创建一个新函数,例如:
def add(x: Int, y: Int) = x + y //> add: (x: Int, y: Int)Int
val addOne: Int => Int = add(1, _) //> addOne : Int => Int = <function1>
addOne(2) //> res0: Int = 3
我想你的情况可以被视为部分应用,但应用 none 的参数 - 你 可以 使用部分应用语法在这里,但你需要给编译器一个_*
提示,因为重复的参数(String*
),结果有点难看:
myCustomConcat(_:_*)
另请参阅:Scala type ascription for varargs using _* cause error