实现Scala数据结构以模仿集合

时间:2017-08-22 00:35:07

标签: scala data-structures collections functional-programming

我尝试在Scala中构建一个数据结构,它通过提供与一系列值相对应的有序序列,基本状态和映射器函数来模拟集合,该函数将在给定值下计算所需的结果在范围内。

基本结构应如下所示:

class MappedRange[A,B,T](rng: IndexedSeq[T], z: A)(mapper: (T, A) => B) {
    private val cache = new mutable.HashMap[T, B]

    def apply(t: T): Option[B] = 
        if rng.contains(t) Some(cache.getOrElseUpdate(t, mapper(t, z)))
        else None
}

其中一个可能的(人为的)用例看起来像这样:

val mapped = new MappedRange((1 to 100), ("a", "b"))
    ((i, z) => if (i % 2 == 0) z._1 else z._2 + i)

// mapped(5) => Some("b5")
// mapped(10) => Some("a")
// mapped(101) => None

这一切都非常直截了当,直到我尝试以这样的方式构建它,即它可以实现Traversablemap上定义的许多方法。一个天真的实现将产生相当于以下的结果:

val fn = (i, z) => if (i % 2 == 0) z._1 else z._2 + i 
val mapped = new MappedRange((1 to 100), ("a", "b"))(f)

val g = _.toVector
mapped.map(g) 
// => new MappedRange(mapped.rng, mapped.base)((i, z) => g(f(i, z)))

我已阅读有关Builders,CanBuildFrom和Scala 2.8集合API的文档,但我对如何在此特定应用程序中使用这些模式感到茫然。具体来说,我需要以这样的方式构建它

  
      
  • "集合" 是引用透明的
  •   
  • mapfilter等方法将返回MappedRange或其各个子类的新实例
  •   
  • Traversable方法的大多数都可以实现,可能使用map
  •   

0 个答案:

没有答案