代码之家  ›  专栏  ›  技术社区  ›  SwiftMango

当值是元组时,如何为HashMap::retain构造谓词?

  •  0
  • SwiftMango  · 技术社区  · 8 年前

    我有一张地图的类型是:

    val m: HashMap[Double, (Double, Long)]
    

    m.retain(p => true)
    

    它抱怨道 Type mismatch. Expected: (Double, (Double, Long)) => Boolean, actual: Double => Boolean

    然后我尝试将类型签名添加到参数:

    m.retain(p: (Double, (Double, Long)) => true)
    

    然后它抱怨 Type mismatch. Expected: (Double, (Double, Long)) => Boolean, actual: (Double, (Double, Long)) => Boolean ,这对我来说没有意义,因为它们是一样的。

    我也试过:

    m.retain((k,(v,t))=>true)
    

    仍然给出类型不匹配错误。

    我想这可能是checker的错误,所以我试着运行编译器,然后给出了另一个不同的错误: identifier expected but 'true' found

    在这种情况下,我怎么办?

    2 回复  |  直到 8 年前
        1
  •  3
  •   Aleksey Isachenkov    8 年前

    scala.collection.mutable.MapLike.retain 参数 p 是一个采用两个参数的函数: key value (这不是一个需要 tuple 具有 钥匙 价值 )

    你需要这样写:

    m.retain((k, v) => true)
    

    或者像这样:

    m.retain({
      case (k, v) => true
    })
    

    m.retain({
      case (k, (v1, v2)) => true
    })
    
        2
  •  1
  •   Aleksey Isachenkov    8 年前

    //function that takes a function that takes multiple arguments
    def test1(f: (Int, Int) => Boolean): Boolean = f(0, 0)
    //function that takes a function that takes a tuple
    def test2(f: ((Int, Int)) => Boolean): Boolean = f((0, 0))
    

    当你使用PartialFunction和write

    test1({
      case (v1, v2) => true
    })
    

    等于

    test1((arg1, arg2) => (arg1, arg2) match {
      case (v1, v2) => true
    })
    

    test2({
      case (v1, v2) => true
    })
    

    等于

    test2(tuple => tuple match {
      case (v1, v2) => true
    })
    

    这两种情况似乎相同,但工作方式不同。如果有多个参数, match 比赛 处理这个元组。

    推荐文章