当我尝试执行以下操作时,我在Scala中遇到奇怪的类型不匹配错误:
val m = Map[String, Int]("a" -> 1, "b" -> 2, "c" -> 3)
val n = Map[String, Int]("c" -> 3, "d" -> 4, "e" -> 5)
n.filter((k: String, v: Int) => !m.contains(k))
<console>:10: error: type mismatch;
found : (String, Int) => Boolean
required: (String, Int) => Boolean
n.filter((k: String, v: Int) => !m.contains(k))
我做错了吗?类型不匹配在这里没有意义。
答案 0 :(得分:14)
实际需要的类型是((String,Int))
,即单个参数是Pair[String,Int]
,但您的语法是传递两个单独的参数。您可以传入部分函数,该函数使用case
关键字匹配对:
n.filter { case(k, v) => !m.contains(k) }
这里有一个Relevant article。
Luigi值得道具指出filterKeys
是一种更适合在这里使用的方法。
答案 1 :(得分:9)
无用的错误消息是Scala 2.9中的已知错误。
应该说的是
found : (String, Int) => Boolean
required: ((String, Int)) => Boolean
即。当Function2[String, Int, Boolean]
需要filter
时,您已提供Function1[(String, Int), Boolean]
。
您可以使用模式匹配来匹配Nick显示的元组,直接提供Tomasz显示的元组功能,或者您可以使用{{1}将Function2
转换为Function1
获取元组方法:
tupled
但是你最好使用内置的n.filter(((k: String, v: Int) => !m.contains(k)).tupled)
// or
n.filter(Function.tupled((k, v) => !m.contains(k)))
方法:
filterKeys
答案 2 :(得分:4)
试试这个:
n.filter(entry => !m.contains(entry._1))
其中entry
是包含(key, value)
的元组,因此entry._1
是关键。