我正在尝试在Scala中实现一个Traversable数据结构,该结构表示fn
上的initial
值转换为TimeInterval
,并定义了Period
fn
} 步。在幕后,它的工作方式目前通过懒惰计算mapper
(称为apply(i: Ind)
)返回的函数的值来调用cache
虽然底层LazyTimeSeries
在技术上是可变的,但值只会被计算一次,我希望这个数据结构以不可变的方式运行并返回case class LazyTimeSeries[+A, B] (
interval: TimeInterval,
initial: A
)(private val fn: (TimeInterval, A) => (Int, LocalDate) => B)
extends TimeSeries[A, B]
with GenericTraversableTemplate[(Int, (LocalDate, B)), LazyTimeSeries[A, B]]
{
private val mapper = fn(interval, initial)
private val cache = new mutable.HashMap[Int, (LocalDate, Eval[B])]
private def pairAt(i: Int): (LocalDate, Eval[B]) = pairAt(i, interval(i))
private def pairAt(i: Int, d: LocalDate): (LocalDate, Eval[B]) =
cache.getOrElseUpdate(i, (d, Eval.later(mapper(i, d))))
def apply(i: Int): Option[(LocalDate, B)] =
if (i < 0 || i >= interval.size) None
else Some(pairAt(i) match { case (d, e) => (d, e.value) })
def foreach[U](f: ((Int, (LocalDate, B))) => U): Unit =
interval.indices.map(i => (i, pairAt(i))).foreach({
case (i, (d, e)) => e.flatMap(b => { f(i, (d, b)); Eval.later(b) })
})
}
的新实例
GenericTraversableTemplate
在任何情况下,我目前遇到的问题是我想扩展Traversable
,但我目前收到以下错误:
错误:(18,58)LazyTimeSeries [A,B]不采用任何类型参数,预期:1 与GenericTraversableTemplate [(Int,(LocalDate,B)),LazyTimeSeries [A,B]]
我已经对实现@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(new AggregateApplicationBuilder()
.web(false)
.from(MySource.class)
.via(MyProcessor.class)
.to(LogSink.class)
.run(new String[] {}));
}
进行了一些挖掘,但就类型系统而言,我有一点心理障碍,以及如何最好地为这种类型的系统实现相应的构建器数据结构。在此先感谢您的帮助!