找不到参数 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
。它是一个类型类,为Int
、Float
、Double
等实现了一些常见的数值运算。
我不确定您为什么要使用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]