在Scala中实现一个惰性时间序列

时间:2017-08-17 21:41:15

标签: scala data-structures types functional-programming

我正在尝试在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[] {})); } 进行了一些挖掘,但就类型系统而言,我有一点心理障碍,以及如何最好地为这种类型的系统实现相应的构建器数据结构。在此先感谢您的帮助!

0 个答案:

没有答案