簡體   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