【问题标题】:overloaded method value + with alternatives重载方法值 + 带有替代方法
【发布时间】:2017-11-16 17:41:48
【问题描述】:

我是 scala 的新手,我正在尝试用我现有的列表创建一个列表。

我的当前列表

val votesByLang: scala.collection.immutable.Map[String,Seq[(String, Int)]] = Map(pythom -> List((pythom,10)), scala -> List((scala,1), (scala,10), (scala,1)), java -> List((java,4)))

votesByLang.map{
  case (witch,counts) => (witch,counts.foldLeft(0)((x,y)=>x+y))
}.toSeq

这给出了一个错误:

      <console>:13: error: overloaded method value + with alternatives:
      (x: Int)Int <and>
      (x: Char)Int <and>
      (x: Short)Int <and>
      (x: Byte)Int
      cannot be applied to ((String, Int))
      votesByLang.map{case (witch,counts)=>(witch,counts.foldLeft(0) ((x,y)=>x+y))}.toSeq

但如果我将 _ 用于任何相同的工作正常并产生结果

votesByLang.map{
  case (witch,counts) => (witch,counts.foldLeft(0)((_+_._2)))
}.toSeq

结果: Seq[(String, Int)] = Vector((pythom,10), (scala,12), (java,4))

第一种方法有什么问题

【问题讨论】:

  • 您在第一个版本中缺少_2(在(String, Int) 中返回Int)。
  • 是的,你是对的,所以第一个对象 x 是一个累加器,第二个是数字列表,所以 votesByLang.map{case (witch,counts)=>(witch,counts.foldLeft(0) ((x:Int,y)=>x+y._2))}.toSeq
  • @Marth 在我们的 map 函数中 counts 是 Int 并且我们在 counts 上调用 foldLeft 所以理想情况下它 y 变量应该是 Int 而不是 List 对吧?
  • y 不是List 而是一个元组(String, Int)(参见Seq 的类型(Map 中的值)。

标签: scala


【解决方案1】:

正如 Marth 所建议的那样,以下是可行的。

 votesByLang.map{
 case (witch,counts)=>(witch,counts.foldLeft(0)((x:Int,y)=>x+y._2))}.toSeq

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-19
    • 2020-06-03
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    相关资源
    最近更新 更多