我有示例代码:
def test = {
val l : Seq[(String, String)] = Seq()
val foo : (String, String) => Unit = {case (a, b)=>}
l.foreach[Unit](foo)
}
它给了我下一个错误:
Error:(8, 21) type mismatch;
found : (String, String) => Unit
required: ((String, String)) => Unit
l.foreach[Unit](foo)
据我所知,foreach
的类型为(A=>U)=>Unit
,其中:
A
是我的收藏品的模板参数,U
是foreach
本身的模板参数我的问题是为什么需要((String, String)) => Unit
?额外括号来自哪里?
答案 0 :(得分:4)
如果您签入REPL,您会看到foo
是<function2>
,即一个带2个参数的函数:
scala> val foo : (String, String) => Unit = {case (a, b)=>}
foo: (String, String) => Unit = <function2>
.foreach
但是期望一个函数只需要一个争论(A
类型),在你的情况下是Tuple2
。
如果您将foo
设置为<function1>
,那么它可以正常运行:
scala> val foo : ((String, String)) => Unit = {case (a, b)=>}
foo: ((String, String)) => Unit = <function1>
scala> val l : Seq[(String, String)] = Seq()
l: Seq[(String, String)] = List()
scala> l.foreach[Unit](foo)
scala>
答案 1 :(得分:2)
让我们从顶部开始。
你有
catcollection.find({},{},function(e,catss){
cats=catss;
console.log('cats --> '+util.inspect(cats));
**res.render('newpost', {
cats:cats, title: 'Add New post'});**
}); // end find all cats for select
这是两个字符串的元组val l: Seq[(String, String)]
。因此,Seq
的每个元素都是l
类型,它是(String, String)
的语法糖。
现在你有了
Tuple2[String, String]
这是两个参数的函数,每个参数都是val foo: (String, String) => Unit
。同样,上面的类型签名是String
的语法糖。
考虑到上述情况,您的代码可以按如下方式重写:
Function2[String, String, Unit]
def test = {
val l: Seq[Tuple2[String, String]] = Seq()
val foo: Function2[String, String, Unit] = {case (a, b)=>}
l.foreach[Unit](foo)
}
需要单个参数函数,即foreach
,因此类型不匹配。
答案 2 :(得分:1)
类型定义foo: (String, String) => Unit
表示foo
是一个函数,它接受String
类型的两个参数。但是,您的序列l: Seq[(String, String)]
包含type t = (String, String)
类型的元组。因此,调用l.foreach
需要一个适用于元组类型t
的函数。因此,它期望类型为t => Unit
的函数,它等同于((String, String)) => Unit
。