繁体   English   中英

令人困惑的Scala中的类型不匹配

[英]Confusing type mismatch in Scala

我有:

val words = List("all", "the", "words", "all", "the", "counts", "all", "day")
val map = Exercise02.count(words.iterator)
val expected = Map("all" -> 3, "the" -> 2, "words" -> 1, "counts" -> 1, "day" -> 1)

其中, Exercise02.countjava.util.Iterator[String] => Map[String, Int] ,只生成输入java.util.Iterator[String]中每个单词的计数。

我写了一个测试:

object Exercise02Spec extends FlatSpec with Inspectors {
  val words = List("all", "the", "words", "all", "the", "counts", "all", "day")
  val map = Exercise02.count(words.iterator)
  val expected = Map("all" -> 3, "the" -> 2, "words" -> 1, "counts" -> 1, "day" -> 1)

  "count" should "count the occurrence of each word" in {
    forAll (map) { kv => assert(kv._2 === expected(kv._1)) }
    // forAll (map) { (k: String, v: Int) => assert(v === expected(k)) }
  }
}

第一行编译得很好,测试通过。 如果我用注释掉的第二行替换第一行,我会收到编译错误。

  • sbt reports: found : (String, Int) => Unit, required: ((String, Int)) => Unit
  • IntelliJ IDEA报告: Type mismatch, expected: ((String, Int)) => Unit, actual: (String, Int) => Unit

为什么是这样? 我该如何解决?

您正在使用的方法接受将单个参数转换为单个输出的函数。 你在第二个声明中告诉Scala的是,map应该接受一个带有两个参数的函数! 单个参数恰好是大小为2的元组和两个不同的参数之间存在重要差异。

所以你有一个参数,但你(和Scala)知道它是一个元组。 要访问这两个元素,您必须根据所需的元组对您的参数进行解构模式匹配 你只需要编写forAll (map) { case (k: String, v: Int) => assert(v === expected(k)) }做到这一点。 你说你收到的参数应该与元组(String, Int)的模式相匹配,你希望第一个元素绑定到k而第二个元素绑定到v 您可以在此处明确省略提及类型。 请注意,这类似于模式匹配中使用的语法,这基本上就是您在这里所做的。

在第二个示例中,您将定义两个参数函数,而不是单个元组参数函数。 因此,为什么错误说它期望参数周围的双括号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM