簡體   English   中英

在Fold方法中鍵入不匹配Scala

[英]Type mismatch scala in Fold method

我正在學習Scala,並且在編寫一個簡單的reducer函數時遇到了一些麻煩。 我想計算一個值出現在列表中的次數。 因此,我編寫了一個reducer / folding函數,該函數將不可變的映射作為初始值,然后用值在列表中出現的次數迭代列表,以“更新”該映射。 很簡單的東西,但是我在類型系統上遇到了問題(啊...在JavaScript和Python上花了太多時間)

這是功能:

def times(chars: List[Char]): List[(Char, Int)] = {

  val acc:Map[Char, Int] = Map()

  def count(acc:Map[Char, Int], c:Char) = {
    if (acc contains c) acc + (c -> (acc(c) + 1))
    else acc + (c -> 1)
  }

  chars.fold(acc)(count).toList
}

我不明白為什么會收到以下類型錯誤:

[error] /Users/giuseppe/courses/scala_functional_programing/lessons/week_4/assignment/src/main/scala/patmat/Huffman.scala:85: type mismatch;
[error]  found   : (Map[Char,Int], Char) => scala.collection.immutable.Map[Char,Int]
[error]  required: (Any, Any) => Any
[error]       chars.fold(acc)(count)
[error]                       ^
[error] /Users/giuseppe/courses/scala_functional_programing/lessons/week_4/assignment/src/main/scala/patmat/Huffman.scala:85: type mismatch;
[error]  found   : Any
[error]  required: List[(Char, Int)]
[error]       chars.fold(acc)(count)
[error]                 ^
[error] two errors found

Map[Char, Int]Any的子類型嗎?

*編輯*

更有趣的是,我剛剛發現,如果我使用foldLeft ,它可以正常工作。 :confused:為什么?

任何幫助將非常感激。 謝謝

看起來您需要foldLeft函數而不是fold。 它具有適當的簽名。

def foldLeft[B](z: B)(f: (B, A) => B): B = { // in your case B is Map and A is Char
def fold[A1 >: A](z: A1)(op: (A1, A1) => A1): A1 = foldLeft(z)(op) // in your case arguments of count functions should be same

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM