" foreach"的类型在斯卡拉

时间:2015-09-16 13:33:36

标签: scala types

我有示例代码:

  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是我的收藏品的模板参数,
  • Uforeach本身的模板参数

我的问题是为什么需要((String, String)) => Unit?额外括号来自哪里?

3 个答案:

答案 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