scala breeze中集合的隐式Impl方法

时间:2015-11-20 17:50:01

标签: scala implicit scala-breeze

我在SortedMap[Int, Double]上有一个类型别名,我希望有一个隐含的允许我将我的SortedMap传递给微风中的某些内置函数,特别是{{ 1}}函数breeze.stats._variance

这是一个没有暗示的工作示例:

stddev

package com.soquestion import breeze.linalg._ import breeze.stats._ import scala.collection.SortedMap import scala.language.implicitConversions object proof { type Series = SortedMap[Int, Double] def example: Double = { val s: Series = SortedMap(1 -> 9.0, 2 -> 2.0, 3 -> 5.0, 4 -> 4.0, 5 -> 12.0, 6 -> 7.0, 7 -> 8.0, 8 -> 11.0, 9 -> 9.0, 10 -> 3.0, 11 -> 7.0, 12 -> 4.0, 13 -> 12.0, 14 -> 5.0, 15 -> 4.0, 16 -> 10.0, 17 -> 9.0, 18 -> 6.0, 19 -> 9.0, 20 -> 4.0) stddev(s.values) } }

中运行
sbt console

我希望不必指定scala> com.soquestion.proof.example res0: Double = 3.0607876523260447 ,只需致电.valuesstddev(s)

这是我试过的

variance(s)

但是我得到了编译错误

package com.soquestion

import breeze.linalg._
import breeze.stats._
import scala.collection.SortedMap
import scala.language.implicitConversions

object proof {
    // Implicitly convert the SortedMap, or any map, to a DenseVector[Double]
  implicit def series2DenseVector(s: Traversable[(Int, Double)]): DenseVector[Double] = {
    DenseVector(s.map(_._2).toArray)
  }
  type Series = SortedMap[Int, Double]

  def example: Double = {
    val s: Series = SortedMap(1 -> 9.0, 2 -> 2.0, 3 -> 5.0, 4 -> 4.0, 5 -> 12.0, 6 -> 7.0, 7 -> 8.0, 8 -> 11.0, 9 -> 9.0, 10 -> 3.0, 11 -> 7.0, 12 -> 4.0, 13 -> 12.0, 14 -> 5.0, 15 -> 4.0, 16 -> 10.0, 17 -> 9.0, 18 -> 6.0, 19 -> 9.0, 20 -> 4.0)

    stddev(s) // <--- compiler error here
  }
}

通过breeze文档,我无法找到一个很好的例子,说明我需要提供什么。理想情况下,我想隐含一个允许我同时调用could not find implicit value for parameter impl: breeze.stats.stddev.Impl[com.soquestion.proof.Series,VR] stdev而没有多重含义的内容。

我确实看到了问题Scala Breeze DenseVector Implicit failure,但我看不出它会如何适用于这种情况。

基于@ dlwh以下答案的完整格式化答案,以防将来有人需要

variance

1 个答案:

答案 0 :(得分:2)

文档可能会更好,我希望我能使错误消息更有帮助。

如果您查看stddev's source,您会发现它需要variance.Impl的实施,这需要meanAndVariance.Impl,可以为{{1}的任何类型提供CanTraverseValues[T, Double]隐含的。默认情况下,集合隐含CanTraverseValues,但仅限于包含的类型,而不是scala的Map类型的值。 实现CanTraverseValues和CanMapValues将启用大多数微风UFunc。

Scala通常不会“链接”暗示,这就是您的proof示例无效的原因。