找不到参数 num 的隐式值:Numeric[Option[Double]]

Posted

技术标签:

【中文标题】找不到参数 num 的隐式值:Numeric[Option[Double]]【英文标题】:Could not find implicit value for parameter num: Numeric[Option[Double]] 【发布时间】:2019-03-23 01:35:57 【问题描述】:

我是 Scala 的新手,正在尝试掌握 Option。我在尝试着 根据字符串键对以下列表的双精度值成员求和:

val chmembers = List(("Db",0.1574), ("C",1.003), ("Db",15.4756), ("D",0.003), ("Bb",1.4278), ("D",13.0001))

总结为:

List((D,13.0031), (Db,15.633000000000001), (C,1.003), (Bb,1.4278))

我当前的代码是

def getClassWeights: List[(Option[String], Option[Double])] = 

    chMembers.flatMap(p => Map(p.name -> p.weight))
      .groupBy(_._1).mapValues(_.map(_._2)sum).toList

  

但是这不会编译并返回:

'找不到参数 num 的隐含值: 数字[选项[双]]'。 我不明白“数字”来自哪里或如何处理它。

如有任何建议,我将不胜感激。提前致谢。

【问题讨论】:

为什么要返回Option[_]?什么条件应该创建None 值? 【参考方案1】:

Numeric 用于执行sum。它是一个类型类,为IntFloatDouble 等实现了一些常见的数值运算。

我不确定您为什么要使用Option,我认为它不会帮助您解决问题。您的代码可以简化为:

val chmembers = List(("Db",0.1574), ("C",1.003), ("Db",15.4756), ("D",0.003), ("Bb",1.4278), ("D",13.0001))

def getClassWeights: List[(String, Double)] = 
  chmembers.groupBy(_._1).mapValues(_.map(_._2).sum).toList

【讨论】:

【参考方案2】:

你可以这样做:

val chmembers = List(("Db",0.1574), ("C",1.003), ("Db",15.4756), ("D",0.003), ("Bb",1.4278), ("D",13.0001))
chmembers.groupBy(_._1).mapValues(_.map(_._2).sum)

输出

//Map(D -> 13.0031, Db -> 15.633000000000001, C -> 1.003, Bb -> 1.4278)

【讨论】:

感谢您的回复。但是,这是我希望能够处理的 Option 参数。这就是编译问题所在...... 您可以先展平列表,它将删除所有 None from 选项,并在选择 groupBy 时使用 _._1.get 从一些相同的值中获取值

以上是关于找不到参数 num 的隐式值:Numeric[Option[Double]]的主要内容,如果未能解决你的问题,请参考以下文章

运行“stats()”的 Spark 错误:找不到参数 num 的隐式值:Numeric [Double]

找不到参数元组的隐式值

找不到参数 e 的隐式值

Scala 类型参数化,Shapeless - 找不到参数 Generic 的隐式值

找不到参数的隐式值

找不到参数 flash 的隐式值