我在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
,只需致电.values
和stddev(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
答案 0 :(得分:2)
文档可能会更好,我希望我能使错误消息更有帮助。
如果您查看stddev
's source,您会发现它需要variance.Impl
的实施,这需要meanAndVariance.Impl
,可以为{{1}的任何类型提供CanTraverseValues[T, Double]
隐含的。默认情况下,集合隐含CanTraverseValues
,但仅限于包含的类型,而不是scala的Map
类型的值。
实现CanTraverseValues和CanMapValues将启用大多数微风UFunc。
Scala通常不会“链接”暗示,这就是您的proof
示例无效的原因。