我有以下问题.我试图创建一个接受两个参数的高阶函数:String和函数类型.函数类型以这种方式定义:
(String, List[String]) => List[(String, List[String])]
Run Code Online (Sandbox Code Playgroud)
我还定义了两个函数f1
,f2
它们具有相同的类型.之后我试着myfun
用f1
或打电话f2
.这是代码:
object Main extends App {
def f1(t: (String,List[String])): List[(String,List[String])] = ...
def f2(t: (String,List[String])): List[(String,List[String])] = ...
def myfun(tableName: String)(fn: (String,List[String]) => List[(String,List[String])]): List[(String,List[String])] =
...
val res: List[(String,List[String])] = myfun("...")(f1)
res foreach println
val res2: List[(String,List[String])] = myfun("...")(f2)
res2 foreach println
}
Run Code Online (Sandbox Code Playgroud)
这是错误:
[error] found : (String, List[String]) => List[(String, List[String])]
[error] required: (String, List[String]) => List[(String, List[String])]
[error] val res: List[(String,List[String])] = myfun("...")(f1)
Run Code Online (Sandbox Code Playgroud)
我无法理解编译器为什么抱怨.有人可以解释一下吗?
试试这个.请注意参数列表周围的额外括号集fn
.
def myfun(tableName: String)
(fn: ((String,List[String])) => List[(String,List[String])]): List[(String,List[String])] = ...
Run Code Online (Sandbox Code Playgroud)
不幸的是,需要这一组额外的括号来区分
Function1[(String, List[String]), List[(String,List[String])]]
Run Code Online (Sandbox Code Playgroud)
从
Function2[String, List[String], List[(String, List[String])]]
Run Code Online (Sandbox Code Playgroud)