【问题标题】:Could not find implicit value for parameter num: Numeric[Option[Double]]找不到参数 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 值?

标签: scala


【解决方案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 从一些相同的值中获取值
    猜你喜欢
    • 2017-11-09
    • 2019-04-23
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 2017-02-02
    • 2016-01-17
    • 2011-10-17
    • 2016-03-31
    相关资源
    最近更新 更多